{
  "name": "unlinked",
  "version": "1.0.0",
  "description": "Search your owner-scoped imported network and the complete published professional People index with an explicitly revocable account grant. Recovered Connections observations require the same confirmed owner; original files are browser-only and excluded from grants. Current grants add whoami, deterministic paginated listings and an explicit AI search tool; old valid grants receive current tools within their enabled permissions and original data scope, without changing token bytes. The same tools are served as a grant-authenticated HTTP JSON API under /api/agent/v1/ (contract: docs/agent-api.md). Professional profile details and privacy boundaries: docs/profile-details.md.",
  "homepage": "https://www.unlinked.ai",
  "transports": {
    "streamable-http": {
      "url": "https://www.unlinked.ai/mcp",
      "toolListChangePush": false
    }
  },
  "authentication": {
    "type": "bearer",
    "setupUrl": "https://www.unlinked.ai/settings",
    "provisioning": "Manual key setup: https://www.unlinked.ai/agents. Lifecycle and release contract: docs/agent-key-settings.md in the repository.",
    "oauth": {
      "protectedResourceMetadata": "https://www.unlinked.ai/.well-known/oauth-protected-resource/mcp",
      "authorizationServerMetadata": "https://www.unlinked.ai/.well-known/oauth-authorization-server",
      "grantTypes": [
        "authorization_code"
      ],
      "pkce": "S256",
      "tokenEndpointAuthMethods": [
        "none"
      ],
      "clientRegistration": [
        "client_id_metadata_document",
        "dynamic_client_registration"
      ],
      "scopes": [
        "network",
        "people",
        "connections"
      ],
      "revocation": "Settings → Connected apps, or RFC 7009 at /oauth/revoke"
    },
    "manualKeyPermissions": "Manual-key controls and connector choice: docs/agent-key-settings.md. Historical-grant normalization, tool refresh and OAuth permission consent: docs/agent-api.md (repository)."
  },
  "tools": [
    {
      "name": "unlinked_search_network",
      "description": "Search the owner's imported network, or pass degree 1/2 plus an optional cursor to read recorded public paths from the explicitly confirmed recovered profile.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          },
          "degree": {
            "type": "integer",
            "enum": [
              1,
              2
            ]
          },
          "cursor": {
            "type": "string",
            "maxLength": 2048
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_search_everyone",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_whoami",
      "description": "Return the authenticated grant owner: stable Unlinked owner id, grant scope/version/tools, import count and confirmed legacy anchor if any. Linkage is the grant itself, never email matching.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_list_people",
      "description": "Deterministically list or lexically filter the published public People index. sort: best (default), name (ignores leading emoji/punctuation, accents and case), name-desc or raw (code-point order). Opaque cursor bound to query and sort, max 50 per page, total and snapshot revision. Public fields only.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "maxLength": 200
          },
          "mode": {
            "type": "string",
            "enum": [
              "best",
              "exact"
            ]
          },
          "sort": {
            "type": "string",
            "enum": [
              "best",
              "name",
              "name-desc",
              "raw"
            ],
            "description": "best (default): relevance with q, else stored name order; name: A–Z from the first letter or number, ignoring leading emoji/punctuation, accents and case (names are returned as written); name-desc; raw: Unicode code-point order of the name as written. Bound into the cursor."
          },
          "cursor": {
            "type": "string",
            "maxLength": 2048
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_list_connections",
      "description": "Deterministically list the owner's connections. Degree 1 includes owner-imported contacts (no anchor required) plus recorded public paths when anchored, grouped one entry per person (exact published-profile or LinkedIn-address evidence, never names) with sources[]; grouping none returns one row per source. Degree 2 returns only recorded public paths with the proving path, or typed degree_unproven. sort: name (default, ignores leading emoji/punctuation), raw, name-desc, connected, imported, company.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "degree": {
            "type": "integer",
            "enum": [
              1,
              2
            ]
          },
          "q": {
            "type": "string",
            "maxLength": 256
          },
          "sort": {
            "type": "string",
            "enum": [
              "name",
              "raw",
              "name-desc",
              "connected",
              "imported",
              "company"
            ],
            "description": "name (default): A–Z from the first letter or number, ignoring leading emoji/punctuation, accents and case (names are returned exactly as written); raw: Unicode code-point order of the name as written; name-desc; connected: most recently connected first; imported: most recently imported first; company: A–Z by company, none last. Bound into the cursor."
          },
          "grouping": {
            "type": "string",
            "enum": [
              "person",
              "none"
            ],
            "description": "Degree 1. person (default): one entry per person, grouped only on exact identity evidence — the same published profile (merges followed) or the same LinkedIn address, never a name — with sources[] listing every underlying record and top-level fields from the owner import; total counts people. none: one row per source record (pre-grouping shape). Bound into the cursor."
          },
          "cursor": {
            "type": "string",
            "maxLength": 4096
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_get_profile",
      "description": "Read one published public profile by id with its public connections page; typed not_found otherwise.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "connectionsCursor": {
            "type": "string",
            "maxLength": 2048
          }
        },
        "additionalProperties": false,
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "unlinked_ai_search",
      "description": "Explicit AI tool. scope 'mine' ranks only your own imported network; scope 'everyone' ranks the published public index and requires a public-scope grant. Owner role queries require supplied title evidence, omit domain-only matches and give short conversational reasons stating unknown sector focus. Set timeoutMs to bound latency.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          },
          "scope": {
            "type": "string",
            "enum": [
              "everyone",
              "mine"
            ]
          },
          "timeoutMs": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 40000
          }
        },
        "additionalProperties": false,
        "required": [
          "query"
        ]
      }
    },
    {
      "name": "unlinked_list_connection_requests",
      "description": "Read-only: list open requests; acting requires the separate explicit opt-in connection scope.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "direction": {
            "type": "string",
            "enum": [
              "received",
              "sent"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_list_notifications",
      "description": "Read-only: the owner's newest in-app notifications with unseen/unread counts. Reading does not mark anything seen or read.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_lookup_contact",
      "description": "Read-only, owner-scoped: resolve one of the owner's own contacts by connectionId, linkedinUrl or published profileId (or up to 100 linkedinRefHash values) without paging. Returns name, headline, company, connectionId, linkedinRefHash (SHA-256 of the canonical LinkedIn slug) and publishedProfileId when the person has a published profile.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "connectionId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          },
          "linkedinUrl": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "profileId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "refHashes": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            },
            "minItems": 1,
            "maxItems": 100
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_send_connection_request",
      "description": "Send a connection request. Only with explicit opt-in; off by default. Same browser authorization and limits.",
      "annotations": {
        "readOnlyHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "profileId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "note": {
            "type": "string",
            "maxLength": 300
          }
        },
        "required": [
          "profileId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_accept_connection_request",
      "description": "Accept a connection request. Only with explicit opt-in; off by default. Same browser authorization and limits.",
      "annotations": {
        "readOnlyHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_ignore_connection_request",
      "description": "Ignore a connection request. Only with explicit opt-in; off by default. Same browser authorization and limits.",
      "annotations": {
        "readOnlyHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_withdraw_connection_request",
      "description": "Withdraw a connection request. Only with explicit opt-in; off by default. Same browser authorization and limits.",
      "annotations": {
        "readOnlyHint": false
      },
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unlinked_get_person_private",
      "description": "Read the owner’s private card about an Unlinked person: profileId may be a published profile id, a connection id from unlinked_list_connections (an imported LinkedIn contact) or a linkedin.com/in/ address. Returns the notes and relations recorded about that person (with note and link ids for corrections), plus profileId, connectionId and linkedinRefHash when they apply. entities is empty when nothing is recorded yet. Notes and relations carry author (“owner” or “agent:<client>”), source (“app”, “connector”, “direct-key” or “suggestion”) and assertion (“stated” or “inferred”); null on records made before provenance was kept. Relations also carry relationType. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "profileId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          }
        },
        "required": [
          "profileId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_get_private_thing",
      "description": "Read one of the owner’s private entities (a saved person, company, idea or project, or any entity id from another private tool) with its notes and relations. Notes and relations carry author (“owner” or “agent:<client>”), source (“app”, “connector”, “direct-key” or “suggestion”) and assertion (“stated” or “inferred”); null on records made before provenance was kept. Relations also carry relationType. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "thingId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "thingId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_list_private_things",
      "description": "List the owner’s private entities (saved people, companies, ideas and projects, and Unlinked or OpenChat people they wrote about), optionally by name and kind. Use an id with unlinked_get_private_thing. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 120
          },
          "kind": {
            "type": "string",
            "enum": [
              "person",
              "company",
              "idea",
              "project"
            ]
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_search_private",
      "description": "Search the owner’s private people knowledge in one call: entities matched by name or private note text, and relations matched by relation text, either end’s name, or relationType (knows, family, works_at, worked_with, works_on, attended, interested_in, other). Give at least one of query, relationType or kind. At most 50 of each; truncated says more matched. Notes and relations carry author (“owner” or “agent:<client>”), source (“app”, “connector”, “direct-key” or “suggestion”) and assertion (“stated” or “inferred”); null on records made before provenance was kept. Relations also carry relationType. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 120
          },
          "relationType": {
            "type": "string",
            "enum": [
              "knows",
              "family",
              "works_at",
              "worked_with",
              "works_on",
              "attended",
              "interested_in",
              "other"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "person",
              "company",
              "idea",
              "project"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_get_neighbourhood",
      "description": "Read one person or thing and what surrounds it in the owner’s private graph: everything one (default) or two private relations away, and those relations (fromId/toId). subjectKind “unlinked” = an Unlinked person: a published profile id, a connection id from unlinked_list_connections (an imported LinkedIn contact) or a linkedin.com/in/ address (the same person is one entity whichever you give); “thing” = one of the owner’s saved people, companies, ideas or projects (its id); “user” = an OpenChat person (user id) the owner already has private notes about. Never creates anything; empty when nothing is recorded. Bounded; truncated says it was cut. Notes and relations carry author (“owner” or “agent:<client>”), source (“app”, “connector”, “direct-key” or “suggestion”) and assertion (“stated” or “inferred”); null on records made before provenance was kept. Relations also carry relationType. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subjectKind": {
            "type": "string",
            "enum": [
              "unlinked",
              "thing",
              "user"
            ]
          },
          "subjectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "depth": {
            "anyOf": [
              {
                "type": "number",
                "enum": [
                  1
                ]
              },
              {
                "type": "number",
                "enum": [
                  2
                ]
              }
            ]
          }
        },
        "required": [
          "subjectKind",
          "subjectId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_save_private_thing",
      "description": "Find or save a private person, company, idea or project by name, for someone with no Unlinked profile or imported contact (“remember Maya from dinner”). Returns its id for notes and links. A name is reused only when it names exactly one saved thing; when several share it the call fails with code ambiguous_name and candidates — ask the user which one. Set createNew true with a clientRequestId only to save a different one with an existing name; retries return the same entity. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "person",
              "company",
              "idea",
              "project"
            ]
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "createNew": {
            "type": "boolean"
          },
          "clientRequestId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "kind",
          "name"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_add_private_note",
      "description": "Add a private note about a person or thing. subjectKind “unlinked” = an Unlinked person: a published profile id, a connection id from unlinked_list_connections (an imported LinkedIn contact) or a linkedin.com/in/ address (the same person is one entity whichever you give); “thing” = one of the owner’s saved people, companies, ideas or projects (its id); “user” = an OpenChat person (user id) the owner already has private notes about. Adding the same text again returns the existing note. Recorded as written by this agent (author agent:<key or app name>, source direct-key). Set assertion “inferred” when you concluded it yourself. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subjectKind": {
            "type": "string",
            "enum": [
              "unlinked",
              "thing",
              "user"
            ]
          },
          "subjectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000
          },
          "assertion": {
            "type": "string",
            "enum": [
              "stated",
              "inferred"
            ]
          }
        },
        "required": [
          "subjectKind",
          "subjectId",
          "text"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_delete_private_note",
      "description": "Delete (undo) one of the owner’s private notes by note id. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "noteId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "noteId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_add_private_link",
      "description": "Record a private relation in the owner’s own words (“knows”, “sister of”, “worked with”, “works at”), for example that one imported contact knows another. Subject: subjectKind “unlinked” = an Unlinked person: a published profile id, a connection id from unlinked_list_connections (an imported LinkedIn contact) or a linkedin.com/in/ address (the same person is one entity whichever you give); “thing” = one of the owner’s saved people, companies, ideas or projects (its id); “user” = an OpenChat person (user id) the owner already has private notes about. Target: toKind “unlinked” + toId (published profile id, connection id or linkedin.com/in/ address), toKind “user” + toId (OpenChat user id already in the owner’s private notes), or toKind person/company/idea/project with toId (saved thing id) or toName. A name is reused only when it names exactly one saved thing; when several share it the call fails with code ambiguous_name and candidates — ask the user which one, then pass its id. Set createNew true with a clientRequestId only to save a different one with an existing name. The same subject, relation and target is one link, so retries never duplicate. Recorded as written by this agent (author agent:<key or app name>, source direct-key). relationType is derived from the words. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subjectKind": {
            "type": "string",
            "enum": [
              "unlinked",
              "thing",
              "user"
            ]
          },
          "subjectId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "relation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "toKind": {
            "type": "string",
            "enum": [
              "unlinked",
              "user",
              "person",
              "company",
              "idea",
              "project"
            ]
          },
          "toId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "toName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "createNew": {
            "type": "boolean"
          },
          "clientRequestId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "assertion": {
            "type": "string",
            "enum": [
              "stated",
              "inferred"
            ]
          }
        },
        "required": [
          "subjectKind",
          "subjectId",
          "relation",
          "toKind"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_update_private_link",
      "description": "Correct one of the owner’s private relations in place by link id, for example “sister of” to “cousin of”. The relation text, its relationType and the link’s identity change together; if the owner already has that exact relation between the same two ends, the two become one and the existing link is returned with merged true. Recorded as written by this agent (author agent:<key or app name>, source direct-key). Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "linkId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "relation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "assertion": {
            "type": "string",
            "enum": [
              "stated",
              "inferred"
            ]
          }
        },
        "required": [
          "linkId",
          "relation"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_delete_private_link",
      "description": "Delete (undo) one of the owner’s private relations by link id. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "linkId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "linkId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    },
    {
      "name": "unlinked_delete_private_thing",
      "description": "Delete (undo) one of the owner’s private entities by id: removes it with its private notes and every private relation to or from it. Cannot be reversed. Deleting an entity about an Unlinked person forgets only the owner’s private notes; the profile and contact are untouched. Owner-only private knowledge: visible only to the owner (never to the person it is about), stored in the owner’s Ideaflow people overlay and shown in Unlinked (person and contact pages) and OpenChat. Never notifies anyone. It is NOT a connection request and NOT messaging.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "thingId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "required": [
          "thingId"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": false
      },
      "permission": "private_notes"
    }
  ],
  "connectionBrowsing": {
    "browserPath": "/people/{id}/connections",
    "sort": [
      "detail",
      "name"
    ],
    "queryParameter": "q",
    "detailLevel": [
      "basic",
      "detailed"
    ],
    "description": "Page depth describes visible content, independently of membership. Only published connections are browsed."
  },
  "publicWebSearch": {
    "url": "https://www.unlinked.ai/search-public",
    "authentication": "none",
    "methods": [
      "GET",
      "HEAD"
    ],
    "queryParameter": "q",
    "maxPageSize": 50,
    "scope": "published professional People only; excludes private networks and contact details",
    "format": "server-rendered HTML without JavaScript",
    "alternateTransport": {
      "url": "https://unlinked-ideaflowco.vercel.app/search-public",
      "experimental": true,
      "scope": "same live canonical public page; no credentials forwarded or stored publication",
      "readerVerification": "ordinary ChatGPT access not established"
    }
  },
  "messaging": {
    "provider": "OpenChat",
    "identity": "shared Ideaflow account",
    "documentation": "https://www.unlinked.ai/AGENTS.md",
    "agentSending": false,
    "confidentialRecipientResolver": "/api/messaging/v1/recipient",
    "webInbox": "/messages",
    "browserMessagesApi": {
      "path": "/messages/api",
      "authorization": "browser-session-and-csrf",
      "agentAccess": false
    },
    "agentSetup": "https://chat.globalbr.ai/agents",
    "agentCredential": "Separate OpenChat oc_ key for messages and Context; Unlinked grants cannot send messages."
  },
  "shared_connector": {
    "url": "https://id.ideaflow.app/mcp",
    "setup_url": "https://id.ideaflow.app/agents",
    "scopes": [
      "unlinked:read",
      "unlinked:write"
    ]
  },
  "browserCardSharing": {
    "ownerCard": "https://www.unlinked.ai/card",
    "contactCardJoin": "Explicit browser-only same-origin POST /c/<token>/add preserves the card through verified signup and adds the connection. Scanning alone does not connect. Not an agent capability."
  },
  "requestDiagnostics": {
    "enabledByDefault": false,
    "responseHeader": "X-Request-ID",
    "idTrust": "server-generated; incoming trace IDs ignored",
    "privacy": "No credentials, queries, result bodies or sensitive URL parameters. Opaque account correlation only after successful authentication.",
    "gatewayLimitation": "Shared gateway does not currently forward the downstream Unlinked request ID."
  },
  "publicPeoplePresence": {
    "values": [
      "member",
      "legacy",
      "shadow"
    ],
    "description": "Presence semantics and the historical-account reclaim boundary are owned by docs/public-people-reader.md#historical-membership in the repository."
  }
}
