{
  "specVersion": "1.0",
  "host": {
    "displayName": "ZaapIn",
    "documentationUrl": "https://zaapin.com/ai"
  },
  "entries": [
    {
      "identifier": "urn:air:zaapin.com:mcp:profile-signup-sandbox",
      "displayName": "ZaapIn profile sign-up — sandbox MCP server",
      "type": "application/mcp-server-card+json",
      "description": "The ZaapIn sign-up tools over MCP, on the ZaapIn sandbox. Eight tools: three, called in order, create a professional profile for an insurance advisor, agent or broker in India — send a verification code, check the code the person read in their own email, create the profile; five more finish it — read ZaapIn's own reference lists, then record areas of expertise, the insurers the person places business with, the firm's address, and submit the licence with the person's PAN. Finishing is offered, never demanded. This is the sandbox — the records it creates are not real. ZaapIn has not published a production MCP endpoint yet.",
      "tags": [
        "insurance",
        "india",
        "onboarding",
        "sandbox"
      ],
      "capabilities": [
        "zaapin_send_verification_code",
        "zaapin_verify_code",
        "zaapin_create_profile",
        "zaapin_get_reference_data",
        "zaapin_set_expertise",
        "zaapin_set_insurers",
        "zaapin_set_firm_address",
        "zaapin_submit_licence"
      ],
      "representativeQueries": [
        "create my ZaapIn profile for me",
        "sign me up to ZaapIn as an insurance advisor",
        "register my insurance agency on ZaapIn",
        "finish my ZaapIn profile — expertise, insurers, address and licence",
        "try the ZaapIn sign-up tools against the sandbox"
      ],
      "data": {
        "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
        "name": "com.zaapin/zaapin-sandbox",
        "description": "ZaapIn sandbox: create an insurance advisor's profile and finish it. Records are not real.",
        "version": "0.1.0",
        "websiteUrl": "https://zaapin.com/ai",
        "remotes": [
          {
            "type": "streamable-http",
            "url": "https://sandboxzaapin-459743726944.asia-south1.run.app/mcp"
          }
        ],
        "tools": [
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Step 1 of 3. Ask ZaapIn to email a verification code to the person you are helping. Tell them what will happen before you call it, without pretending to know which way it goes: if that email already has a ZaapIn profile, the code will simply tell you so and you will point them to sign in instead — nothing new gets created either way. The reply is deliberately the same whether or not the address is already known to ZaapIn, so it tells you nothing about their account — that is not an error, go to step 2. The code is valid for 10 minutes. If they need another one you may call this again, but there is a 45-second cooldown per address and a limit of 10 sends per address per day; a call made inside the cooldown succeeds and sends nothing, so waiting is the only thing that works. IF NO CODE ARRIVES after a couple of minutes, waiting longer is not the answer and neither is sending again: ask them to check their spam folder, and then to read the address back to you letter by letter. A mistyped address that still looks valid gets the same neutral reply as a real one — that is deliberate, and it means this tool cannot tell you the address was wrong. Their inbox is the only place the mistake shows. If they correct it, start again at step 1 with the corrected address; the earlier one needs no undoing and simply expires. You will never be given the code: ask your person to read it out of their own email.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "email": {
                  "type": "string",
                  "description": "the person's own email address; the verification code is sent here, so it must be one they can open right now"
                }
              },
              "required": [
                "email"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_send_verification_code",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "code_requested, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person, or why the request was refused"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Send a ZaapIn verification code"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Step 2 of 3. Send back the code your person read in their email. Do not call this until they have answered, and pass on exactly what they gave you. A wrong or expired code is refused; after 5 wrong attempts the code is destroyed and step 1 must be repeated, so if it fails ask them to read it again rather than trying variations. Read the outcome. ready_to_create is the new-profile path: keep the signup_token for step 3. already_has_profile and invitation_pending both mean STOP and tell them — joining an organization, or getting back into an existing profile, is theirs to do at https://app.zaapin.com.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "email": {
                  "type": "string",
                  "description": "the same email address the code was sent to"
                },
                "code": {
                  "type": "string",
                  "description": "the verification code the person read in their own email and gave you; never guess it, never try variations"
                }
              },
              "required": [
                "email",
                "code"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_verify_code",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "ready_to_create, already_has_profile, invitation_pending, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "signup_token": {
                  "type": "string",
                  "description": "pass this to zaapin_create_profile; present only when the outcome is ready_to_create"
                },
                "required_fields": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "the fields the create step needs"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Check the ZaapIn verification code"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Step 3 of 3. Create the profile, using the signup_token from step 2. Every value here comes from your person — never invent one. If the profile is refused because fields are still blank, ask them for exactly those fields; do not fill them in yourself. The referral field is optional and is only ever filled with a link or code THEY gave you, copied exactly; leave it out otherwise. On success ZaapIn emails them a welcome message, and they can sign in at https://app.zaapin.com with the same email and the same emailed-code door — there is no password to remember. This tool creates a first profile only. Creating a second firm for somebody who already has one is a signed-in act done on screen; do not attempt it here.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "signup_token": {
                  "type": "string",
                  "description": "the signup_token returned by zaapin_verify_code"
                },
                "first_name": {
                  "type": "string",
                  "description": "the person's first name, as they want it to appear"
                },
                "last_name": {
                  "type": "string",
                  "description": "the person's last name, as they want it to appear"
                },
                "phone": {
                  "type": "string",
                  "description": "the person's phone number, as they gave it to you"
                },
                "org_type": {
                  "type": "string",
                  "description": "exactly one of: Agent, Broker, Corporate Agent, Insurance Association, Insurance Marketing Firm, Point of Sale (POS)"
                },
                "org_name": {
                  "type": "string",
                  "description": "the firm's name, from the person. Required for Broker, Corporate Agent, Insurance Association and Insurance Marketing Firm — ask, never compose. Optional for Agent and Point of Sale (POS): leave it out and their first name is used, which you must then tell them"
                },
                "referral": {
                  "type": "string",
                  "description": "a ZaapIn referral link or code the person VOLUNTEERED, passed along exactly as they gave it to you — for example zaapin.com/from/narendra, or a bare code off a card. Never compose, guess, complete or reformat one, and never ask for a code they did not mention. Leave it out when they said nothing about a referral"
                }
              },
              "required": [
                "signup_token",
                "first_name",
                "last_name",
                "phone",
                "org_type"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_create_profile",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "profile_created, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "firm_name_sent": {
                  "type": "string",
                  "description": "the firm name the profile was actually created with"
                },
                "firm_name_auto_filled": {
                  "type": "boolean",
                  "description": "true when no firm name was given and the person's first name was used instead — say so to them"
                },
                "missing_fields": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "fields still blank; ask the person for exactly these and do not fill them in yourself"
                },
                "organization_id": {
                  "type": "string",
                  "description": "ZaapIn's public id for the organization that was created"
                },
                "sign_in_url": {
                  "type": "string",
                  "description": "where the person signs in"
                },
                "completion_token": {
                  "type": "string",
                  "description": "pass this to every completion tool. It lets you finish THIS person's profile for the next few minutes and nothing else — it is not a sign-in, and it stops working shortly"
                },
                "completion_token_expires_in": {
                  "type": "integer",
                  "description": "how many seconds the completion_token lasts, as ZaapIn stated it"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status",
                "firm_name_auto_filled"
              ],
              "additionalProperties": false
            },
            "title": "Create the ZaapIn profile"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": true
            },
            "description": "Call this FIRST, before any of the other completion tools, and work only from what it returns. It gives you ZaapIn's own expertise taxonomy (headings, each with its areas), ZaapIn's insurer list with each insurer's category, and what one licence of each type may declare. Use its spellings exactly: an expertise area ZaapIn does not list will be refused, and a limit you remember from elsewhere may be wrong. The limits are also how you offer the person the gaps — if their licence allows an insurer in each of health, life and general and they have named one, you may offer the other two. Offer, never press: leaving it for later is always a fine answer.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "completion_token": {
                  "type": "string",
                  "description": "the completion_token returned by zaapin_create_profile"
                }
              },
              "required": [
                "completion_token"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_get_reference_data",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "reference_data, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person, or why the request was refused"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "catalog": {
                  "type": "object",
                  "description": "ZaapIn's own reference data, exactly as the API served it: lobs (headings and their sub_types), specialities (area to parent heading), carriers (insurer code to name, short_name and category), licence_limits (what one licence of each type may declare), expertise_insurer_categories (which insurer categories each expertise area reaches), and org_types",
                  "additionalProperties": true
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Read ZaapIn's own lists and limits"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Record the person's areas of expertise. Read zaapin_get_reference_data first and send its exact area names. Map what they say onto ZaapIn's own headings and areas — if they say \"motor\", find which heading lists it and read out that heading's other areas too, in case more of them apply. Then read the final list back to them in ZaapIn's words and wait for their yes before calling this. If they have told you before what they advise on, say what you remember and ask them to confirm rather than asking again; anything they add now is an ordinary answer. This replaces whatever was recorded before, so send the whole list every time.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "completion_token": {
                  "type": "string",
                  "description": "the completion_token returned by zaapin_create_profile"
                },
                "areas": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "the expertise areas the person advises on, spelled EXACTLY as the reference catalog spells them (the keys of specialities). Read them back to the person and get their yes before calling this"
                }
              },
              "required": [
                "completion_token",
                "areas"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_set_expertise",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "expertise_saved, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "areas_sent": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "the areas that were sent, so you can confirm them back"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Record what the person advises on"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Record which insurance companies the person places business with, using the insurer codes from zaapin_get_reference_data. Read the insurer NAMES back to them and wait for their yes before calling this. This replaces whatever was recorded before, so send the whole list every time. The reply carries what their licence allows, in ZaapIn's own numbers and ZaapIn's own sentence. Quote those; never quote a limit you remember from anywhere else. If they have named fewer than they are allowed, you may offer the difference — as an offer, not a push. If ZaapIn refuses the list, tell them exactly what it said and ask them; do not drop an insurer to make the call pass.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "completion_token": {
                  "type": "string",
                  "description": "the completion_token returned by zaapin_create_profile"
                },
                "insurer_codes": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "the insurer codes the person works with, from the reference catalog's carriers. This is the WHOLE list: it replaces whatever was there. Read the insurer names back to the person and get their yes before calling this"
                },
                "licence_type": {
                  "type": "string",
                  "description": "the kind of licence the person holds, if they have told you. Leave it out and ZaapIn uses the practice type the profile was created with"
                }
              },
              "required": [
                "completion_token",
                "insurer_codes"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_set_insurers",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "insurers_saved, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "limit": {
                  "type": "object",
                  "description": "what this licence may declare, as ZaapIn stated it: per_category and total. These are the ONLY numbers you may quote to the person",
                  "additionalProperties": true
                },
                "limit_in_words": {
                  "type": "string",
                  "description": "ZaapIn's own sentence for that bound; quote it rather than composing your own"
                },
                "pool": {
                  "type": [
                    "null",
                    "array"
                  ],
                  "items": true,
                  "description": "the insurers the organization now declares, as ZaapIn returned them"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Record the insurers the person works with"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Record where the person's practice is. They will usually say the address in one breath — take it apart into street, city, state and PIN, then READ THE WHOLE THING BACK to them, PIN and state included, and wait for their yes before calling this. Working out the PIN and state from the address they gave you is fine; putting in an address they did not give you is not. If you are unsure of the PIN, ask them rather than picking one. If they have told you their address before, say it back and ask them to confirm it is still right.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "completion_token": {
                  "type": "string",
                  "description": "the completion_token returned by zaapin_create_profile"
                },
                "address_line_1": {
                  "type": "string",
                  "description": "the street address, as the person gave it"
                },
                "city": {
                  "type": "string",
                  "description": "the city"
                },
                "state": {
                  "type": "string",
                  "description": "the state"
                },
                "state_code": {
                  "type": "string",
                  "description": "the state's short code, if you know it"
                },
                "zip_code": {
                  "type": "string",
                  "description": "the PIN code"
                },
                "country_code": {
                  "type": "string",
                  "description": "the country code; IN unless the person says otherwise"
                }
              },
              "required": [
                "completion_token",
                "address_line_1",
                "city",
                "state"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_set_firm_address",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "address_saved, or refused"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "address_sent": {
                  "type": "string",
                  "description": "the address as it was sent, on one line, so you can confirm it back"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Record the firm's address"
          },
          {
            "annotations": {
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            },
            "description": "Submit the licence with the person's PAN. The PAN is all ZaapIn needs — do not ask for a licence number, a licence type, an issuing agency, a date or a document, and do not send one; ZaapIn's team records those from the IRDAI register when they check the licence. Tell them why you are asking before you ask: their PAN is how ZaapIn's team finds and checks their licence on the IRDAI register, and profiles go live only after that review, so customers know everyone listed is licensed. Do not promise how long the review takes. Read the PAN back to them character by character and wait for their yes before calling this — including when you are recalling it from something they told you earlier. Call this ONCE. If ZaapIn refuses, tell them what it said and stop; do not send it again with the same PAN.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "completion_token": {
                  "type": "string",
                  "description": "the completion_token returned by zaapin_create_profile"
                },
                "pan_number": {
                  "type": "string",
                  "description": "the person's PAN, exactly as they gave it. Read it back character by character and get their yes before calling this — a one-character error creates a wrong regulatory record"
                },
                "owner_type": {
                  "type": "string",
                  "description": "user when the licence is the person's own, org when it is the firm's. Leave it out for user, which is the ordinary case"
                }
              },
              "required": [
                "completion_token",
                "pan_number"
              ],
              "additionalProperties": false
            },
            "name": "zaapin_submit_licence",
            "outputSchema": {
              "type": "object",
              "properties": {
                "outcome": {
                  "type": "string",
                  "description": "licence_submitted, refused, or submitted_without_reference"
                },
                "message": {
                  "type": "string",
                  "description": "what to tell the person"
                },
                "http_status": {
                  "type": "integer",
                  "description": "the status the ZaapIn API answered with"
                },
                "reference": {
                  "type": "string",
                  "description": "ZaapIn's reference for the submission"
                },
                "status": {
                  "type": "string",
                  "description": "where the submission now stands"
                },
                "next_step": {
                  "type": "string",
                  "description": "what to do next"
                }
              },
              "required": [
                "outcome",
                "message",
                "http_status"
              ],
              "additionalProperties": false
            },
            "title": "Submit the person's licence for review"
          }
        ]
      }
    },
    {
      "identifier": "urn:air:zaapin.com:guide:create-profile",
      "displayName": "Create a ZaapIn profile — instructions for AI agents",
      "type": "text/html",
      "url": "https://zaapin.com/ai",
      "description": "The published guide an agent follows to create a ZaapIn profile and finish it: what to collect from the person at every step, the account's three API calls in order over plain HTTPS, the referral link or code the person may volunteer, what each refusal means, how to finish the profile (expertise, insurers, firm address, and the licence via PAN alone), and the rules it must not break.",
      "tags": [
        "insurance",
        "india",
        "onboarding",
        "documentation"
      ],
      "representativeQueries": [
        "how do I create a ZaapIn profile for someone using the API",
        "what does ZaapIn need in order to sign up an insurance advisor",
        "the ZaapIn sign-up API steps",
        "how does an AI agent finish a ZaapIn profile after the account is created"
      ]
    },
    {
      "identifier": "urn:air:zaapin.com:doc:llms-txt",
      "displayName": "ZaapIn llms.txt",
      "type": "text/markdown",
      "url": "https://zaapin.com/llms.txt",
      "description": "What ZaapIn is, who it is for, and what it costs, written to be read by a language model: the free professional-presence and directory layer, the opt-in insurance operating system and its modules, and a pointer to the fuller llms-full.txt.",
      "tags": [
        "insurance",
        "india",
        "company-context"
      ],
      "representativeQueries": [
        "what is ZaapIn",
        "is there software built for Indian insurance advisors to run renewals",
        "what does ZaapIn cost"
      ]
    }
  ]
}
