{
  "server": {
    "name": "knowcap-mcp",
    "version": "1.0.0"
  },
  "counts": {
    "tools": 79,
    "resources": 8,
    "prompts": 8,
    "documented": 79
  },
  "categories": [
    {
      "category": "Artifacts",
      "tools": [
        "create_artifact",
        "delete_artifact",
        "generate_artifact",
        "get_artifact",
        "get_artifact_access",
        "get_artifact_access_audit",
        "list_artifacts",
        "set_artifact_access",
        "update_artifact"
      ]
    },
    {
      "category": "Chats",
      "tools": [
        "create_chat",
        "delete_chat",
        "get_chat",
        "list_chat_messages",
        "list_chats",
        "send_chat_message"
      ]
    },
    {
      "category": "Digest",
      "tools": [
        "digest_project"
      ]
    },
    {
      "category": "Folders",
      "tools": [
        "create_folder",
        "delete_folder",
        "file_sources_to_folder",
        "get_folder_access",
        "get_folder_access_audit",
        "list_folders",
        "remove_source_from_folder",
        "set_folder_access",
        "update_folder"
      ]
    },
    {
      "category": "Hierarchy",
      "tools": [
        "get_organization_md",
        "get_project_md",
        "get_user_md"
      ]
    },
    {
      "category": "Memories",
      "tools": [
        "get_memory",
        "search_memories",
        "update_memory_review"
      ]
    },
    {
      "category": "Projects",
      "tools": [
        "archive_project",
        "create_project",
        "delete_project",
        "get_me",
        "get_project",
        "list_organizations",
        "list_projects",
        "set_default_org",
        "unarchive_project",
        "update_project"
      ]
    },
    {
      "category": "Search",
      "tools": [
        "search_by_speaker",
        "search_cross_org",
        "search_project"
      ]
    },
    {
      "category": "Sharing",
      "tools": [
        "create_share_link",
        "list_share_links",
        "revoke_share_link"
      ]
    },
    {
      "category": "Sources",
      "tools": [
        "confirm_source_upload",
        "delete_source",
        "generate_source_tags",
        "get_source",
        "get_source_access",
        "get_source_access_audit",
        "get_source_transcriptions",
        "get_source_visuals",
        "list_inbox",
        "list_sources",
        "move_source",
        "prepare_source_upload",
        "resolve_source_url",
        "set_source_access",
        "update_source"
      ]
    },
    {
      "category": "Speakers",
      "tools": [
        "delete_voiceprint",
        "get_speaker",
        "identify_speaker",
        "list_speakers",
        "list_voiceprints",
        "merge_voiceprints",
        "rename_voiceprint"
      ]
    },
    {
      "category": "Workflow",
      "tools": [
        "get_memory_edges",
        "get_rate_limit_status",
        "get_recap",
        "join_meeting",
        "list_claims",
        "list_meetings",
        "list_org_members",
        "route_claim",
        "route_inbox_source",
        "set_org_member_role"
      ]
    }
  ],
  "tools": [
    {
      "name": "archive_project",
      "title": "Archive a Knowcap project (soft-delete)",
      "category": "Projects",
      "summary": "Hides a project from your regular lists without deleting anything inside it — everything stays intact and can be brought back at any time.",
      "agentDescription": "Soft-delete: marks the project status=archived. Hides it from listings but keeps all sources, memories, artifacts, and chats intact. Reversible via unarchive_project. Prefer this over delete_project.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "confirm_source_upload",
      "title": "Step 2/2 — confirm an upload after PUTing the file to the signed URL",
      "category": "Sources",
      "summary": "Second step of a two-step file upload — finishes the upload once the file has been sent, and kicks off transcription and AI processing.",
      "agentDescription": "Call after prepare_source_upload and after the caller has successfully PUT the file bytes to its uploadUrl. Creates the source record and triggers transcription/AI processing. storagePath, fileName, fileSize, and mimeType must match what was used for the PUT.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "fileName",
          "type": "string",
          "required": true,
          "description": "Same fileName passed to prepare_source_upload."
        },
        {
          "name": "fileSize",
          "type": "integer",
          "required": true,
          "description": "Same fileSize passed to prepare_source_upload."
        },
        {
          "name": "mimeType",
          "type": "string",
          "required": true,
          "description": "mimeType returned by prepare_source_upload (echo it back, don't re-guess)."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "Same projectId passed to prepare_source_upload."
        },
        {
          "name": "storagePath",
          "type": "string",
          "required": true,
          "description": "storagePath returned by prepare_source_upload."
        },
        {
          "name": "tags",
          "type": "array",
          "required": false,
          "description": "Optional tags to apply after upload."
        }
      ]
    },
    {
      "name": "create_artifact",
      "title": "Create an artifact",
      "category": "Artifacts",
      "summary": "Save your own written content as a new artifact inside a project, optionally linking it to the sources it came from.",
      "agentDescription": "Create a new artifact in a project from raw content. Use generate_artifact to ask Knowcap AI to write one for you.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "content",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "sourceIds",
          "type": "array",
          "required": false,
          "description": "Optional source ids to associate the artifact with."
        },
        {
          "name": "title",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "type",
          "type": "string",
          "required": false,
          "description": "Optional artifact type label (e.g. \"summary\", \"note\", \"doc\")."
        }
      ]
    },
    {
      "name": "create_chat",
      "title": "Start a new chat thread",
      "category": "Chats",
      "summary": "Start a brand-new chat conversation inside a project, ready to send messages into.",
      "agentDescription": "Create a new chat thread inside a project.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "title",
          "type": "string",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "create_folder",
      "title": "Create a folder",
      "category": "Folders",
      "summary": "Create a new folder to group sources inside a project. Creating one without saying who may see it defaults to keeping it hidden from everyone except owners and admins, so that combination must be confirmed explicitly.",
      "agentDescription": "Create a folder inside a project to group sources (owner/admin only — 403 otherwise; 409 if the title already exists — on 409, call list_folders and reuse the existing folder rather than retrying with a different name). IMPORTANT: a bare create leaves the folder access_level=\"restricted\" with NO grants — invisible to every non-admin team member. This is the exact state that caused a 2026-07-02 production incident, so OMITTING accessLevel is treated the SAME as explicitly passing accessLevel=\"restricted\" with no userIds/roles — it requires confirmEmptyAllowlist: true too. Pass accessLevel (+ userIds/roles for \"restricted\") to set visibility in the SAME call — this is the recommended way to create a folder meant for the team to use. The response always echoes the effective access_level/allowlist and includes a warning if the folder ended up restricted with an empty allowlist.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "accessLevel",
          "type": "string",
          "required": false,
          "description": "Optional — sets visibility in the same call. Omitting this does NOT skip the empty-allowlist gate: the server default IS \"restricted\", so omitting still requires confirmEmptyAllowlist: true (or userIds/roles) exactly like passing accessLevel=\"restricted\" explicitly."
        },
        {
          "name": "confirmEmptyAllowlist",
          "type": "boolean",
          "required": false,
          "description": "Required when accessLevel=\"restricted\" OR accessLevel is omitted (server defaults to restricted) and both userIds and roles are empty. See set_folder_access for why."
        },
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "roles",
          "type": "array",
          "required": false,
          "description": "For accessLevel=\"restricted\" (or omitted): roles to grant (e.g. every \"member\")."
        },
        {
          "name": "title",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "userIds",
          "type": "array",
          "required": false,
          "description": "For accessLevel=\"restricted\" (or omitted): specific users to grant."
        }
      ]
    },
    {
      "name": "create_project",
      "title": "Create a Knowcap project",
      "category": "Projects",
      "summary": "Creates a new project inside one of your organizations, ready to hold meetings, memories, and files.",
      "agentDescription": "Create a new project inside an organization. The caller must be a member of the organization.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "color",
          "type": "string",
          "required": false,
          "description": "Optional hex color for the project chip."
        },
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": null
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": true,
          "description": "Organization UUID to create the project under."
        }
      ]
    },
    {
      "name": "create_share_link",
      "title": "Create a public share link for a source or artifact",
      "category": "Sharing",
      "summary": "Create a public link that anyone can open without an account, for a specific source or artifact. Calling this again for the same item returns the same link instead of making a new one, and you can optionally set it to expire after a number of hours.",
      "agentDescription": "Generate a public /share/<token> URL anyone can open without logging in. Returns the existing link if one already exists for this source/artifact — the call is idempotent. Optional expiresInHours (omit = never expires).",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "expiresInHours",
          "type": "number",
          "required": false,
          "description": "Optional expiry in hours. Omit for a non-expiring link."
        },
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "The source UUID or artifact UUID being shared."
        },
        {
          "name": "kind",
          "type": "string",
          "required": true,
          "description": "Whether to share a source or an artifact."
        }
      ]
    },
    {
      "name": "delete_artifact",
      "title": "Delete an artifact (destructive)",
      "category": "Artifacts",
      "summary": "Permanently remove an artifact along with its version history and any share links pointing to it. This cannot be undone.",
      "agentDescription": "Permanently delete an artifact along with any versions, share links, and source associations attached to it. Not reversible. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete."
        }
      ]
    },
    {
      "name": "delete_chat",
      "title": "Delete a chat thread (destructive)",
      "category": "Chats",
      "summary": "Permanently delete a chat conversation and everything in it. This cannot be undone.",
      "agentDescription": "Permanently delete a chat thread and all its messages. Not reversible. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "chatId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete."
        }
      ]
    },
    {
      "name": "delete_folder",
      "title": "Delete a folder",
      "category": "Folders",
      "summary": "Remove a folder from a project. The sources inside are not deleted — they move back to the project's top level and stay fully visible there.",
      "agentDescription": "Delete a folder (owner/admin only). Low-stakes: sources inside are NOT deleted — they auto-unfile to the project's top level (fully visible there again). Only the folder grouping and its access grants are removed. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete."
        },
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "delete_project",
      "title": "Delete a Knowcap project (destructive — hard delete)",
      "category": "Projects",
      "summary": "Permanently removes a project and everything inside it — recordings, transcripts, memories, and files — with no way to undo it. Archiving is the safer, reversible alternative for most cases.",
      "agentDescription": "PERMANENTLY delete a project AND ALL of its sources, transcript segments, vision frames, RAG-index rows, memories, artifacts, chats, share links, and speaker associations. Not reversible. STRONGLY prefer archive_project (soft-delete, restorable). Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete. False / omitted returns an error explaining the cascade."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "delete_source",
      "title": "Delete a source (destructive)",
      "category": "Sources",
      "summary": "Permanently delete a source and everything tied to it — transcript, memories, screen captures, and share links. This cannot be undone.",
      "agentDescription": "Permanently delete a source (recording / meeting / document / url / youtube) AND its transcript segments, vision frames, RAG-index rows, memories tied to it, and any share links pointing at it. Not reversible. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete. False / omitted returns an error explaining the cascade."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "delete_voiceprint",
      "title": "Delete a voiceprint (destructive)",
      "category": "Speakers",
      "summary": "Permanently remove a saved voice from your voice library. Past transcripts keep the name they already had, but Knowcap will no longer auto-recognize that voice in new recordings.",
      "agentDescription": "Permanently delete a voiceprint from the caller's voice library. Past transcript segments stay attributed to the name but lose the ability to auto-match new recordings against this voice. Not reversible. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually delete."
        },
        {
          "name": "voiceprintId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "digest_project",
      "title": "One-shot project digest",
      "category": "Digest",
      "summary": "Gets a one-stop overview of a project — its open tasks, risks, decisions, key facts, and recent recordings, files, and chats — all in a single call instead of checking each one separately.",
      "agentDescription": "Aggregate project state in a single call: open tasks, risks, decisions, key facts, recent sources, recent artifacts, and recent chats — each with a clickable permalink. Use as the first call when starting work on a project so you do not have to make 6 separate list calls.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "artifactLimit",
          "type": "integer",
          "required": false,
          "description": "Max recent artifacts. Default 10."
        },
        {
          "name": "chatLimit",
          "type": "integer",
          "required": false,
          "description": "Max recent chats. Default 10."
        },
        {
          "name": "memoryLimit",
          "type": "integer",
          "required": false,
          "description": "Max memories per category. Default 10."
        },
        {
          "name": "memoryStatus",
          "type": "array",
          "required": false,
          "description": "Memory review statuses to include. Defaults to confirmed+edited (signal only)."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "sourceLimit",
          "type": "integer",
          "required": false,
          "description": "Max recent sources. Default 10."
        }
      ]
    },
    {
      "name": "file_sources_to_folder",
      "title": "File one or more sources into a folder",
      "category": "Folders",
      "summary": "Move one or more sources into a folder inside the same project. Filing into a folder set to restricted access can hide those sources from anyone not granted access on it, so that combination must be confirmed explicitly.",
      "agentDescription": "Move sources into a folder within the same project (owner/admin only). A source can be in at most one folder — filing moves it out of any prior folder. If the target folder is access_level=\"restricted\" (the common case — it is the default), filed sources become invisible (sources panel AND AI chat/RAG) to any team member not granted access on that folder — this call checks the target folder's access_level first and requires confirm: true when it is \"restricted\", so you cannot silently hide sources from the team. The response echoes the folder's access_level. Accepts 1-500 source ids in one call.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Required (true) only when the target folder resolves to access_level=\"restricted\" — otherwise ignored."
        },
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "sourceIds",
          "type": "array",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "generate_artifact",
      "title": "Generate an artifact via Knowcap AI",
      "category": "Artifacts",
      "summary": "Have Knowcap AI write a new artifact for you from a prompt, optionally grounded in specific sources so the output reflects what was actually said.",
      "agentDescription": "Ask Knowcap to generate an artifact from a prompt, optionally grounded on specific sources. The backend handles model selection and grounding.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "prompt",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "sourceIds",
          "type": "array",
          "required": false,
          "description": null
        },
        {
          "name": "title",
          "type": "string",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "generate_source_tags",
      "title": "AI-generate tags for a source",
      "category": "Sources",
      "summary": "Have Knowcap's AI generate fresh tags for a source based on its content, replacing whatever tags were there before.",
      "agentDescription": "Trigger Knowcap AI to generate tags for a source based on its content/transcript. Overwrites existing tags. Use update_source if you want to set tags manually.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_artifact",
      "title": "Get an artifact",
      "category": "Artifacts",
      "summary": "Open a single artifact and read its full content.",
      "agentDescription": "Fetch a single artifact by id, including its full content body.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_artifact_access",
      "title": "Get an artifact's visibility settings",
      "category": "Artifacts",
      "summary": "See who can currently see an artifact — its visibility level and, if you manage it, the exact list of people or roles allowed in.",
      "agentDescription": "Get an artifact's access_level (member/restricted/private) and, if you can manage it (creator or project owner/admin), its full allowlist. Non-managers get an EMPTY allowlist in the response even when real grants exist — only trust the allowlist when canManage:true.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_artifact_access_audit",
      "title": "Get an artifact's visibility-change history",
      "category": "Artifacts",
      "summary": "See the history of visibility changes made to an artifact — who changed access, when, and what changed — as opposed to who currently has access.",
      "agentDescription": "Get the last 50 access-level/allowlist changes for an artifact — who changed it, when, from what level to what, and which users/roles were added/removed. Creator or project owner/admin only.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_chat",
      "title": "Get a chat",
      "category": "Chats",
      "summary": "Look up a single chat conversation by its id, including its title and basic details.",
      "agentDescription": "Fetch a single chat thread by id.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "chatId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_folder_access",
      "title": "Get a folder's visibility settings",
      "category": "Folders",
      "summary": "See who can currently see a folder — its visibility level and, if you manage it, the exact list of people or roles allowed in.",
      "agentDescription": "Get a folder's access_level (member/restricted/private) and, if you can manage it (project owner/admin), its full allowlist. Non-managers get an EMPTY allowlist in the response even when real grants exist — only trust the allowlist when canManage:true.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_folder_access_audit",
      "title": "Get a folder's visibility-change history",
      "category": "Folders",
      "summary": "See the history of visibility changes made to a folder — who changed access, when, and what changed — as opposed to who currently has access.",
      "agentDescription": "Get the last 50 access-level/allowlist changes for a folder — who changed it, when, from what level to what, and which users/roles were added/removed. Project owner/admin only.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_me",
      "title": "Get current Knowcap user + default org",
      "category": "Projects",
      "summary": "Confirms who you're signed in as and which organization is set as your default workspace, so every other action knows where to look first.",
      "agentDescription": "Call this FIRST in any session. Returns the user the API key belongs to AND their default_org_id — the org this user works in by default. Multi-org users are the norm; use default_org_id as the organizationId argument to org-scoped tools (list_projects, list_inbox, search_cross_org) so you never mix orgs or drift onto the wrong one. Never reuse an org id you scraped from some earlier tool result — resolve it from here or from list_organizations.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": []
    },
    {
      "name": "get_memory",
      "title": "Get a memory by id",
      "category": "Memories",
      "summary": "Fetch one memory by its id. It looks through a project's recent memories to find the match, so a very old memory outside that recent window may not turn up.",
      "agentDescription": "Fetch a single memory. Implementation note: the Knowcap backend currently exposes only list + review for memories, so this tool runs the list endpoint and filters client-side. If the memory is not in the most recent 200, pass projectId for a wider scan.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "memoryId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "Project the memory belongs to (required for the list-and-filter fallback)."
        }
      ]
    },
    {
      "name": "get_memory_edges",
      "title": "Get a memory's relations (supersedes / blocks / relates)",
      "category": "Workflow",
      "summary": "See how one extracted decision, task, risk, or fact connects to others — what it replaces, what it's blocked by, or what it relates to.",
      "agentDescription": "Return the graph edges for a memory — what it supersedes, is superseded by, blocks, or relates to. Use to trace whether a commitment was overridden by a later one, or what a decision depends on.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "memoryId",
          "type": "string",
          "required": true,
          "description": "Memory id."
        }
      ]
    },
    {
      "name": "get_organization_md",
      "title": "Get an organization's instructions doc (org.md)",
      "category": "Hierarchy",
      "summary": "Fetches the shared instructions for your whole organization — things like tone, vocabulary, and what each memory category means for your team — so you can see the ground rules everyone else is working from.",
      "agentDescription": "Fetch the org-tier Instructions Hierarchy doc — org-level identity, vocabulary, tone, what memory categories mean for this org. Distinct from the organization row itself. Membership-gated: the caller must be an active member of the org.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "organizationId",
          "type": "string",
          "required": true,
          "description": "Organization UUID."
        }
      ]
    },
    {
      "name": "get_project",
      "title": "Get a Knowcap project",
      "category": "Projects",
      "summary": "Looks up a single project's details by its id.",
      "agentDescription": "Fetch a single project by id.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "Project UUID"
        }
      ]
    },
    {
      "name": "get_project_md",
      "title": "Get a project's instructions doc (project.md)",
      "category": "Hierarchy",
      "summary": "Fetches a project's own instructions doc — its glossary, scope, and any special people or context that project cares about.",
      "agentDescription": "Fetch the project-tier Instructions Hierarchy doc — project glossary, scope, special parties. Distinct from get_project (which returns the project row). Accepts a project slug or UUID. Requires project membership (or org owner/admin of the project's org).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectSlugOrId",
          "type": "string",
          "required": true,
          "description": "Project slug or UUID."
        }
      ]
    },
    {
      "name": "get_rate_limit_status",
      "title": "Check this key's remaining rate-limit / quota",
      "category": "Workflow",
      "summary": "Check how much of your daily usage allowance is left, so you can pace a big batch of work before you hit the limit.",
      "agentDescription": "Return the API key's current rate-limit status — plan, daily cap, and how much is left. Call this before a long fan-out (e.g. processing many sources) to budget your calls and avoid hitting the daily limit mid-task. Optionally pass organizationId to attribute the check to a specific org.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Optional org UUID for attribution."
        }
      ]
    },
    {
      "name": "get_recap",
      "title": "Get the recap for a source",
      "category": "Workflow",
      "summary": "Get the meeting recap Knowcap generated for a recording — the same summary content used for a debrief email — without sending anything.",
      "agentDescription": "Fetch the generated recap (meeting-debrief email content) for a source, if one exists. Read-only. Generating and SENDING a recap are not yet exposed (send emails an external recipient — coming in a later wave).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": "Source id (meeting/recording)."
        }
      ]
    },
    {
      "name": "get_source",
      "title": "Get a source",
      "category": "Sources",
      "summary": "Look up a single source by its id and get back its details and file link. To read what was actually said, use the transcript lookup instead.",
      "agentDescription": "Fetch a single source by id. Returns the source metadata and a (possibly signed) file_url. For transcription text, use get_source_transcriptions.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_source_access",
      "title": "Get a source's visibility settings",
      "category": "Sources",
      "summary": "Check who can currently see a source and, if you manage it, the full list of people and roles with access.",
      "agentDescription": "Get a source's access_level (member/restricted/private) and, if you can manage it (creator or project owner/admin), its full allowlist. Non-managers get an EMPTY allowlist in the response even when real grants exist — only trust the allowlist when canManage:true.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_source_access_audit",
      "title": "Get a source's visibility-change history",
      "category": "Sources",
      "summary": "See the history of who changed a source's visibility settings, when, and what changed.",
      "agentDescription": "Get the last 50 access-level/allowlist changes for a source — who changed it, when, from what level to what, and which users/roles were added/removed. Creator or project owner/admin only.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_source_transcriptions",
      "title": "Get a source transcription with clickable timestamps",
      "category": "Sources",
      "summary": "Get the full transcript of a meeting or recording, broken into segments with clickable timestamps that jump straight to that moment. Can be narrowed to a specific time window.",
      "agentDescription": "Return the transcription segments for a source. Each segment includes a Markdown link [mm:ss](app-url) that opens the meeting in Knowcap at that exact second. Optionally restrict to a [startTime, endTime] window in seconds.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "endTime",
          "type": "number",
          "required": false,
          "description": "Window end, seconds."
        },
        {
          "name": "format",
          "type": "string",
          "required": false,
          "description": "markdown returns a readable transcript with timestamp hyperlinks. json returns raw segments."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max segments returned. Default 2000. Page longer transcripts with startTime/endTime windows."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "startTime",
          "type": "number",
          "required": false,
          "description": "Window start, seconds."
        }
      ]
    },
    {
      "name": "get_source_visuals",
      "title": "Get visual frames for a source",
      "category": "Sources",
      "summary": "Get the screen-share and slide images captured during a recording, each with an AI-written caption and a timestamp link — handy for finding who was on screen and when.",
      "agentDescription": "Return the visual frames extracted from a recording (Vision/screen-share JPEGs). Each frame includes the public image URL, the AI-generated caption, the start_time in seconds, and a clickable [mm:ss](permalink) markdown that opens the meeting at that exact moment. Use for screenshare evidence, slide capture, who-was-on-screen-when questions.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "endTime",
          "type": "number",
          "required": false,
          "description": "Window end, seconds."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max frames returned. Default 200."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "startTime",
          "type": "number",
          "required": false,
          "description": "Window start, seconds."
        }
      ]
    },
    {
      "name": "get_speaker",
      "title": "Get a speaker",
      "category": "Speakers",
      "summary": "Finds one speaker from a project's roster by id — handy when you already know the id and just want that person's details.",
      "agentDescription": "Knowcap has no public single-speaker getter today; this tool fetches all speakers in the project and filters client-side.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "speakerId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "get_user_md",
      "title": "Get a user's instructions doc (user.md)",
      "category": "Hierarchy",
      "summary": "Fetches a person's instructions doc — their role, how they like escalations handled, and their style preferences. Defaults to your own; looking up someone else's only works if you share a project with them.",
      "agentDescription": "Fetch the user-tier Instructions Hierarchy doc — role, escalation defaults, style preferences. Omit userId for the caller's own doc (always allowed). Passing another user's id requires that user to share an active project with the caller; if the backend hasn't shipped that carve-out yet, or the two don't share a project, this returns a 403 — surface it rather than treating it as empty.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "userId",
          "type": "string",
          "required": false,
          "description": "Target user's UUID. Omit for the caller's own user.md."
        }
      ]
    },
    {
      "name": "identify_speaker",
      "title": "Identify an anonymous speaker in a transcript",
      "category": "Speakers",
      "summary": "Give a real name to an unidentified speaker (like \"SPEAKER_00\" or \"Guest 1\") across everywhere they spoke in a recording, and optionally save their voice so future recordings recognize them automatically.",
      "agentDescription": "Rename a SPEAKER_xx (or current display name like \"Guest 1\") to a real name across every transcript segment in a source. If saveVoiceprint=true AND the recording has a stored voice centroid for that speaker, an enrolled voiceprint is created so future recordings auto-match. This is the canonical way to add a new speaker to your voice library.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "The real name to assign to every segment of this speaker."
        },
        {
          "name": "saveVoiceprint",
          "type": "boolean",
          "required": false,
          "description": "If true and a centroid is available, also enroll this voice into your voiceprint library."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "speakerLabel",
          "type": "string",
          "required": true,
          "description": "The raw label (e.g. \"SPEAKER_00\") or the current display name (e.g. \"Guest 1\")."
        }
      ]
    },
    {
      "name": "join_meeting",
      "title": "Send the recorder bot to a meeting (side-effecting)",
      "category": "Workflow",
      "summary": "Send the recording bot into a scheduled meeting so it joins, records, and transcribes the call. This is a real, visible action — the bot actually appears in the live meeting — so it cannot be undone once triggered.",
      "agentDescription": "Dispatch the Knowcap recorder bot to join a scheduled meeting so it gets recorded/transcribed. This is an OUTWARD action — the bot visibly joins a live call — so it requires confirm:true. Get the meeting id from list_meetings.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true — the bot visibly joins a live meeting. False/omitted returns an error."
        },
        {
          "name": "meetingId",
          "type": "string",
          "required": true,
          "description": "Scheduled meeting id (from list_meetings)."
        }
      ]
    },
    {
      "name": "list_artifacts",
      "title": "List artifacts in a project",
      "category": "Artifacts",
      "summary": "See every artifact — AI-generated or hand-written note, summary, or document — that has been created in a project.",
      "agentDescription": "List all AI-generated or user-created artifacts (notes, summaries, documents) in a project.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_chat_messages",
      "title": "List messages in a chat",
      "category": "Chats",
      "summary": "Read the full back-and-forth of one chat conversation, message by message.",
      "agentDescription": "Fetch the message history of a single chat thread.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "chatId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_chats",
      "title": "List project chats",
      "category": "Chats",
      "summary": "List every chat conversation inside a project, so you can find or resume a discussion instead of starting a new one.",
      "agentDescription": "List all chat threads inside a Knowcap project.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_claims",
      "title": "List extracted claims across projects",
      "category": "Workflow",
      "summary": "See the decisions, tasks, risks, and facts Knowcap has automatically picked out of your recordings, whether or not they've been filed into a project yet.",
      "agentDescription": "Claims are the extracted decisions/tasks/risks/facts awaiting review or already routed, across all accessible projects. Use for commitment/decision tracking that spans projects (search_memories is single-project). Filter by category and importance; page with limit/offset.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "category",
          "type": "string",
          "required": false,
          "description": "Filter to one claim category."
        },
        {
          "name": "importanceMin",
          "type": "number",
          "required": false,
          "description": "Minimum importance score (0–2). Backend default 0.6."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max claims. Backend default 200."
        },
        {
          "name": "offset",
          "type": "integer",
          "required": false,
          "description": "Skip this many before returning."
        },
        {
          "name": "org",
          "type": "string",
          "required": false,
          "description": "Optional org UUID to scope to (defaults to all accessible)."
        }
      ]
    },
    {
      "name": "list_folders",
      "title": "List folders in a project",
      "category": "Folders",
      "summary": "See every folder in a project, along with how many sources and members each one has and who can currently see it.",
      "agentDescription": "List folders in a project (title, description, source_count, member_count, access_level). What you see depends on the caller: owner/admin see every folder plus its member list; a plain member sees only folders they are granted access to, with member details omitted. If this MCP key belongs to a project admin, you CANNOT infer a plain member's visibility just from what this call returns — check each folder's access_level and member_count explicitly (access_level=\"restricted\" with member_count 0 means invisible to everyone except the creator/admins).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_inbox",
      "title": "List sources in the Knowcap Inbox",
      "category": "Sources",
      "summary": "See everything sitting in your Knowcap Inbox that has not been filed into a project yet — newest first, with attendees, duration, and a short transcript preview for each item.",
      "agentDescription": "List sources currently in the Knowcap Inbox — i.e. recordings/uploads the API-key user has not yet routed to a project (project_id IS NULL). Newest first. Returns source rows shaped like list_sources, plus a nested `inbox` object with attendees, duration, transcript snippet, and memory highlights. Note: the underlying /api/inbox/recordings endpoint currently covers meeting / recording / video / audio / url / youtube types; pure `document` and `text` sources are not yet returned by Inbox (Knowcap server roadmap item).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "days",
          "type": "integer",
          "required": false,
          "description": "Scan window in days. Default 30, max 365 (server-enforced)."
        },
        {
          "name": "kind",
          "type": "string",
          "required": false,
          "description": "Filter to a specific source type. `document` and `text` currently return empty (see tool description)."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max sources to return after offset (1–200)."
        },
        {
          "name": "offset",
          "type": "integer",
          "required": false,
          "description": "Skip this many sources before returning. Applied client-side over the inbox window."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Optional org UUID. Sets the x-knowcap-org header for correct billing attribution."
        }
      ]
    },
    {
      "name": "list_meetings",
      "title": "List upcoming scheduled meetings",
      "category": "Workflow",
      "summary": "See what meetings are coming up on your synced calendar — the same schedule the recording bot works from.",
      "agentDescription": "Upcoming synced calendar meetings (today onward) — the recorder bot's schedule. Use for meeting-prep (\"what's coming up\") and to get a meeting id for join_meeting.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Optional org UUID for attribution."
        }
      ]
    },
    {
      "name": "list_org_members",
      "title": "List members of an organization",
      "category": "Workflow",
      "summary": "See everyone in an organization along with their name, email, and role — useful for figuring out who's who or who can approve something.",
      "agentDescription": "The org's people roster (names, emails, roles) — for a people-brief or to resolve who's who. This is org membership, distinct from list_speakers (who spoke in a project's recordings). Requires you to be a member of the org.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "organizationId",
          "type": "string",
          "required": true,
          "description": "Organization UUID (from get_me default_org_id or list_organizations)."
        }
      ]
    },
    {
      "name": "list_organizations",
      "title": "List the user's organizations",
      "category": "Projects",
      "summary": "Lists every organization you're an active member of, along with your role in each one, so you can pick the right workspace before doing anything else.",
      "agentDescription": "Every organization the user is an active member of (id, name, role). Use this to resolve the correct organizationId to pass to org-scoped tools — the authoritative source, instead of scraping an org id out of a project/source result (which is how sessions drift onto the wrong org). get_me returns the DEFAULT org; this returns ALL of them.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": []
    },
    {
      "name": "list_projects",
      "title": "List Knowcap projects",
      "category": "Projects",
      "summary": "Lists your projects, automatically limited to your default organization unless you ask for a specific one or for everything across all your organizations.",
      "agentDescription": "List the user's projects. Pass organizationId to scope to one org (recommended). If you omit it, results are auto-scoped to the user's default org (from get_me) and the response carries scoped_to_default_org:true so you know which org you're seeing — this prevents accidentally mixing projects across the user's multiple orgs. Pass allOrgs:true to deliberately list across every org (results include each project's organization_id).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "allOrgs",
          "type": "boolean",
          "required": false,
          "description": "Set true to list projects across ALL of the user's orgs (no default-org scoping)."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Org UUID to scope to. Omit to auto-scope to the default org; use allOrgs:true for every org."
        }
      ]
    },
    {
      "name": "list_share_links",
      "title": "List all share links for a project",
      "category": "Sharing",
      "summary": "See every public share link in a project, including ones that have expired but haven't been revoked yet, along with what each one points to.",
      "agentDescription": "List every share link (source or artifact) currently active inside a project, including expired-but-not-revoked ones. Returned items include the token, type, expires_at, and the associated source/artifact name.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_sources",
      "title": "List sources in a project",
      "category": "Sources",
      "summary": "List the sources in a project — meetings, recordings, and documents — newest first, with paging for large projects.",
      "agentDescription": "List sources (meetings, recordings, documents) in a Knowcap project. Sources of type \"meeting\" or \"recording\" are the ones with transcriptions. Newest-first; paginate a large project with limit/offset rather than pulling every source into context.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max sources to return after offset (1–200). Omit to return all."
        },
        {
          "name": "offset",
          "type": "integer",
          "required": false,
          "description": "Skip this many sources before returning. Applied client-side."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_speakers",
      "title": "List speakers in a project",
      "category": "Speakers",
      "summary": "List everyone Knowcap has identified as speaking across a project's recordings — the roster of people who appeared in its meetings.",
      "agentDescription": "List the speakers Knowcap has identified across this project's recordings. Speakers are the source-of-truth roster of people who appeared in meetings.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "list_voiceprints",
      "title": "List my voiceprints",
      "category": "Speakers",
      "summary": "List everyone whose voice you've saved to your personal voice library, so Knowcap can automatically recognize them in future recordings. This follows you across every organization, not just one project.",
      "agentDescription": "List every voiceprint in the caller's personal voice library. Voiceprints are user-scoped (they follow the user across organizations), so they aren't project-bound.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": []
    },
    {
      "name": "merge_voiceprints",
      "title": "Merge one voiceprint into another (semi-destructive)",
      "category": "Speakers",
      "summary": "Combine two saved voices in your library into one, moving every past attribution and audio sample onto the voice you keep. The other voice is permanently deleted as part of the merge.",
      "agentDescription": "Merge sourceVoiceprintId INTO targetVoiceprintId. Transfers all transcript-segment attributions and audio samples (capped at 15) to the target, then DELETES the source voiceprint. Both voiceprints must be owned by the caller. Not reversible. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true. False / omitted returns an error explaining the cascade."
        },
        {
          "name": "sourceVoiceprintId",
          "type": "string",
          "required": true,
          "description": "The voiceprint that will be removed."
        },
        {
          "name": "targetVoiceprintId",
          "type": "string",
          "required": true,
          "description": "The voiceprint that absorbs the source."
        }
      ]
    },
    {
      "name": "move_source",
      "title": "Move a source to a different project",
      "category": "Sources",
      "summary": "Move a source into a different project (or out of the Inbox), taking its transcript, memories, and share links along with it.",
      "agentDescription": "Reassign a source from its current project (or the Inbox, if project_id is null) to a target project. Cross-organization moves are allowed when the caller has access to both projects. The source appears at the top of the target project. RAG-index entries are re-keyed; transcript, memories, and share links follow the source.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "targetProjectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "prepare_source_upload",
      "title": "Step 1/2 — get a signed upload URL for a local file",
      "category": "Sources",
      "summary": "First step of a two-step file upload — reserves a spot and hands back a secure link to send the file to. Finish with the matching second step once the file has been sent.",
      "agentDescription": "This MCP server runs remotely and cannot read your local disk — it cannot accept a local file path directly. Call this first to get a signed uploadUrl + storagePath, PUT the file bytes to uploadUrl yourself (e.g. via curl/Bash with Authorization: Bearer <token>, Content-Type: <mimeType>, body = raw file bytes), then call confirm_source_upload with the same storagePath to finish. The source lands in the Inbox (project_id=NULL) — use move_source to route it afterward.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "fileName",
          "type": "string",
          "required": true,
          "description": "File name including extension, e.g. \"call.mp3\". Used to infer mimeType and display name."
        },
        {
          "name": "fileSize",
          "type": "integer",
          "required": true,
          "description": "File size in bytes (stat the local file to get this)."
        },
        {
          "name": "mimeType",
          "type": "string",
          "required": false,
          "description": "Optional MIME type override. Defaults to a guess from the file extension."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "Project UUID — used for access control and billing. The source still lands in the Inbox."
        }
      ]
    },
    {
      "name": "remove_source_from_folder",
      "title": "Remove a source from its folder",
      "category": "Folders",
      "summary": "Take a source out of its folder and move it back to the project's top level, where it's fully visible again. This can be reversed by filing the source into a folder again.",
      "agentDescription": "Unfile a source from its current folder — it moves to the project's top level (fully visible/unrestricted there). Reversible via file_sources_to_folder.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "rename_voiceprint",
      "title": "Rename a voiceprint",
      "category": "Speakers",
      "summary": "Rename a saved voice in your voice library. This only changes the label going forward — it doesn't rewrite the name on speech that was already transcribed.",
      "agentDescription": "Rename an existing voiceprint in the caller's voice library. Affects future auto-attribution but does NOT retroactively rewrite past transcript_segments — use update_source / regenerate flows for that.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "voiceprintId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "resolve_source_url",
      "title": "Resolve a Knowcap URL to a source",
      "category": "Sources",
      "summary": "Paste in a Knowcap web link — to a meeting, recording, or share — and get back the source record it points to.",
      "agentDescription": "Accepts a Knowcap web URL (e.g. https://app.knowcap.ai/project/<projectId>/meeting/<sourceId>, /recording/<sourceId>, /sources/<sourceId>, /v/<sourceId>, or any URL containing a source UUID) and returns the source — same payload as get_source. Errors clearly if no source UUID can be extracted from the URL.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "Knowcap web URL pointing at a source / recording / meeting / share."
        }
      ]
    },
    {
      "name": "revoke_share_link",
      "title": "Revoke a public share link",
      "category": "Sharing",
      "summary": "Turn off a public share link so it can no longer be opened. Anyone who had the link loses access immediately; a new link can be created afterwards if needed.",
      "agentDescription": "Revoke a share link by its token. The token is the bit after /share/ in the public URL, or the `token` field returned by create_share_link / list_share_links.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "token",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "route_claim",
      "title": "Route a claim to a project",
      "category": "Workflow",
      "summary": "File one of those extracted decisions, tasks, risks, or facts into the project it belongs to, or take it back out again.",
      "agentDescription": "Assign an extracted claim to a project (or pass projectId:null to unroute it). You must be a member of the destination project. Use after list_claims to file a decision/task where it belongs.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "claimId",
          "type": "string",
          "required": true,
          "description": "Claim id from list_claims."
        },
        {
          "name": "projectId",
          "type": "union",
          "required": true,
          "description": "Destination project UUID, or null to unroute."
        }
      ]
    },
    {
      "name": "route_inbox_source",
      "title": "Route an inbox recording to a project",
      "category": "Workflow",
      "summary": "Move a recording out of your unsorted inbox and into the right project, optionally filing it into a folder at the same time.",
      "agentDescription": "Move a recording out of the Inbox (project_id=NULL) into a project — the filing step after list_inbox. Optionally also drop it into a folder. This is the write counterpart to list_inbox.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "folderId",
          "type": "string",
          "required": false,
          "description": "Optional folder to file it into as well."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "Destination project UUID."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": "Inbox source id (from list_inbox)."
        }
      ]
    },
    {
      "name": "search_by_speaker",
      "title": "Find sources by speaker across ALL projects",
      "category": "Search",
      "summary": "Finds every meeting where a given person spoke, by checking each project's speaker roster for a name match — handy when you know who was in the room but not which project the conversation happened in. On very large workspaces the scan may stop early and cover only some of the projects checked so far.",
      "agentDescription": "Cross-project speaker search — the \"find everything where <person> spoke\" query. Knowcap has no speaker-scoped search endpoint and search_memories is project-bound, so this walks every accessible project and returns each source (meeting/recording) whose speaker roster matches `speaker` (case-insensitive substring). Optionally scope to one org. Use this instead of list_sources per project when you only know who was in the room.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max matching sources to return. Default 50."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Optional org UUID to scope the search. Omit to search all orgs."
        },
        {
          "name": "speaker",
          "type": "string",
          "required": true,
          "description": "Speaker name or substring, case-insensitive (e.g. \"Omar\", \"omar tamo\")."
        }
      ]
    },
    {
      "name": "search_cross_org",
      "title": "Search across all projects and orgs",
      "category": "Search",
      "summary": "Searches across every project and organization you can access at once, instead of one project at a time — useful when you don't know which project something was said in.",
      "agentDescription": "Cross-org search: searches transcripts, memories, and artifacts across ALL accessible projects. Optionally filter to a single org via organizationId. Returns hits with permalinks, scored by relevance.",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "kinds",
          "type": "array",
          "required": false,
          "description": "Subset of kinds to include. Default: all three."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max total hits. Default 10."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Optional org UUID to scope search. Omit to search all orgs."
        },
        {
          "name": "q",
          "type": "string",
          "required": true,
          "description": "What to search for. Plain text, no operators."
        }
      ]
    },
    {
      "name": "search_memories",
      "title": "Search project memories",
      "category": "Memories",
      "summary": "Search a project's auto-extracted memories — tasks, risks, decisions, facts — filtering by category, review status, or source, with a link back to where each one came from.",
      "agentDescription": "Search auto-extracted memories (tasks, risks, decisions, facts, people, general) inside a project. Filter by category, review status, source kind (chat or recording), and a specific source recording. Memories are returned newest first with a permalink to the source. For AI agents taking real-world actions, prefer the verification_strictness convenience parameter over hand-rolling a status array — it encodes the trust-layer contract (agents act only on human-confirmed facts unless explicitly opted out).",
      "destructive": false,
      "readOnly": true,
      "since": null,
      "parameters": [
        {
          "name": "category",
          "type": "array",
          "required": false,
          "description": "Memory categories to include. \"people\" requires a backend migration; will return zero rows until shipped."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": null
        },
        {
          "name": "offset",
          "type": "integer",
          "required": false,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "source",
          "type": "string",
          "required": false,
          "description": "Restrict to memories extracted from chat messages or from recordings."
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": false,
          "description": "Restrict to memories tied to this source recording."
        },
        {
          "name": "status",
          "type": "array",
          "required": false,
          "description": "Review status filter. Defaults to pending+confirmed+edited. Takes precedence over verification_strictness if both are passed."
        },
        {
          "name": "verification_strictness",
          "type": "string",
          "required": false,
          "description": "Trust-tier convenience parameter for AI agents. 'human_only' returns only memories confirmed by a named human via a browser session (excludes rule-confirmed AND excludes confirmations made by an API-key-authenticated caller, e.g. an agent calling update_memory_review on itself) — use for high-stakes actions (send client message, open PR, charge card). 'rule_auto_ok' additionally includes rule-confirmed memories — use for low-stakes actions (draft internal note). 'all' returns everything regardless of who/what confirmed it — use for inbox/triage UIs. Ignored if `status` is explicitly set."
        }
      ]
    },
    {
      "name": "search_project",
      "title": "Search across transcripts, memories, and artifacts",
      "category": "Search",
      "summary": "Search everything inside one project at once — meeting transcripts, extracted memories and artifacts — and get back results with links that jump straight to the moment they came from.",
      "agentDescription": "Unified project search. Wraps GET /api/projects/:id/search and adds clickable permalinks. Hits transcripts via RAG and memories/artifacts via ilike. Default kinds = [transcript, memory, artifact].",
      "destructive": false,
      "readOnly": true,
      "since": "1.1.0",
      "parameters": [
        {
          "name": "kinds",
          "type": "array",
          "required": false,
          "description": "Subset of kinds to include. Default: all three."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max hits per kind. Default 10."
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": "The project to search within. Get one from list_projects."
        },
        {
          "name": "q",
          "type": "string",
          "required": true,
          "description": "What to search for. Plain text, no operators."
        }
      ]
    },
    {
      "name": "send_chat_message",
      "title": "Send a chat message",
      "category": "Chats",
      "summary": "Post a message into an existing chat and get back the AI-generated reply, the same way the in-app chat works. Each call sends a new message and triggers a fresh response, so re-sending is not a no-op.",
      "agentDescription": "Post a user message to an existing chat. The Knowcap backend will run the message through its agentic chat pipeline and persist the assistant response.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "chatId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "content",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "mentions",
          "type": "array",
          "required": false,
          "description": "Optional @-mentions, mirroring the chat UI mention model."
        }
      ]
    },
    {
      "name": "set_artifact_access",
      "title": "Set an artifact's visibility (destructive — replaces the allowlist)",
      "category": "Artifacts",
      "summary": "Change who can see an artifact by setting its visibility level and, for restricted access, exactly who is allowed in — this replaces the current list rather than adding to it. Setting restricted access without naming anyone who may see it would hide the artifact from your whole team, so that combination must be confirmed explicitly.",
      "agentDescription": "Set an artifact's access_level and restricted allowlist (creator or project owner/admin only — 403 otherwise). WARNING: this REPLACES the entire allowlist, it does not merge — call get_artifact_access first and include existing grants if you want to keep them, or you will silently evict everyone not listed. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "accessLevel",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually change access."
        },
        {
          "name": "confirmEmptyAllowlist",
          "type": "boolean",
          "required": false,
          "description": "Required in addition to confirm when accessLevel=\"restricted\" and both userIds and roles are empty — that combination means creator/admin-ONLY visibility, invisible to every other team member. This exact mistake caused a 2026-07-02 production incident."
        },
        {
          "name": "roles",
          "type": "array",
          "required": false,
          "description": null
        },
        {
          "name": "userIds",
          "type": "array",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "set_default_org",
      "title": "Set the user's default organization",
      "category": "Projects",
      "summary": "Sets which organization is treated as your default workspace, or clears it, so project lists and searches point at the right place automatically.",
      "agentDescription": "Set the user's server-persisted default workspace (the org get_me returns as default_org_id and that list_projects scopes to when unscoped). Only sets a default the caller is an active member of. Pass clear:true to remove the default instead (reverts to the all-orgs view).",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "clear",
          "type": "boolean",
          "required": false,
          "description": "Set true to clear the default org instead of setting one."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "Org UUID to make the default. Required unless clear is true."
        }
      ]
    },
    {
      "name": "set_folder_access",
      "title": "Set a folder's visibility (destructive — replaces the allowlist)",
      "category": "Folders",
      "summary": "Change who can see a folder by setting its visibility level and, for restricted access, exactly who is allowed in — this replaces the current list rather than adding to it. Setting a folder to restricted without naming anyone who may see it would hide it from your whole team, so that combination must be confirmed explicitly.",
      "agentDescription": "Set a folder's access_level and restricted allowlist (project owner/admin only — 403 otherwise). WARNING: this REPLACES the entire allowlist, it does not merge — call get_folder_access first and include existing grants if you want to keep them, or you will silently evict everyone not listed. Only existing project members can be granted (a stranger UUID is silently dropped). Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "accessLevel",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually change access."
        },
        {
          "name": "confirmEmptyAllowlist",
          "type": "boolean",
          "required": false,
          "description": "Required in addition to confirm when accessLevel=\"restricted\" and both userIds and roles are empty — that combination means owner/admin-ONLY visibility, invisible to every other team member. This exact mistake caused a 2026-07-02 production incident."
        },
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "roles",
          "type": "array",
          "required": false,
          "description": null
        },
        {
          "name": "userIds",
          "type": "array",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "set_org_member_role",
      "title": "Change an org member's role",
      "category": "Workflow",
      "summary": "Change what a member is allowed to do in an organization — owner, admin, or member. Granting or removing owner (full control of billing, members, and settings) needs an extra confirmation step because of how much access it hands over.",
      "agentDescription": "Change a member's role in an organization (owner / admin / member). Caller must be an OWNER of that org — admins and members get a 403. Identify the target by email, userId, OR memberId (exactly one) — email is usually easiest and this tool resolves it against the org roster, so you never have to guess whether an id is the user id or the membership-row id. Granting or removing OWNER requires confirm: true, because owner is full control of the org (billing, members, settings). The backend refuses to demote the only owner — transfer ownership first. Reversible: re-call with the previous role. NOTE the role set here is ORG membership (owner/admin/member only) — it is NOT the 6-value access role used by set_folder_access / set_source_access / set_artifact_access.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Required (true) when granting owner, or when changing the role of an existing owner."
        },
        {
          "name": "email",
          "type": "string",
          "required": false,
          "description": "Target member by email (matched case-insensitively against the org roster)."
        },
        {
          "name": "memberId",
          "type": "string",
          "required": false,
          "description": "Target member by their MEMBERSHIP-ROW id (list_org_members `id`). Prefer email or userId."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": true,
          "description": "Organization UUID (from get_me default_org_id or list_organizations)."
        },
        {
          "name": "role",
          "type": "string",
          "required": true,
          "description": "The role to set. owner = full control (billing, members, settings); admin = manage members/content; member = normal access."
        },
        {
          "name": "userId",
          "type": "string",
          "required": false,
          "description": "Target member by their USER id (list_org_members `user.id`)."
        }
      ]
    },
    {
      "name": "set_source_access",
      "title": "Set a source's visibility (destructive — replaces the allowlist)",
      "category": "Sources",
      "summary": "Set who can see a source. This replaces the entire access list, so anyone not included loses access — check the current list first if you want to keep existing people on it.",
      "agentDescription": "Set a source's access_level and restricted allowlist (creator or project owner/admin only — 403 otherwise). WARNING: this REPLACES the entire allowlist, it does not merge — call get_source_access first and include existing grants if you want to keep them, or you will silently evict everyone not listed. Requires confirm: true.",
      "destructive": true,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "accessLevel",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "confirm",
          "type": "boolean",
          "required": false,
          "description": "Must be true to actually change access."
        },
        {
          "name": "confirmEmptyAllowlist",
          "type": "boolean",
          "required": false,
          "description": "Required in addition to confirm when accessLevel=\"restricted\" and both userIds and roles are empty — that combination means creator/admin-ONLY visibility, invisible to every other team member. This exact mistake caused a 2026-07-02 production incident."
        },
        {
          "name": "roles",
          "type": "array",
          "required": false,
          "description": null
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "userIds",
          "type": "array",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "unarchive_project",
      "title": "Unarchive a Knowcap project",
      "category": "Projects",
      "summary": "Brings a previously archived project back into your regular lists.",
      "agentDescription": "Restore a previously archived project to status=active.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "update_artifact",
      "title": "Update an artifact",
      "category": "Artifacts",
      "summary": "Change an artifact's title, content, or type after it has been created.",
      "agentDescription": "Patch an artifact (title, content, or type).",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "artifactId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "patch",
          "type": "object",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "update_folder",
      "title": "Rename or redescribe a folder",
      "category": "Folders",
      "summary": "Rename a folder or change its description. This does not change who can see it.",
      "agentDescription": "Update a folder's title and/or description (owner/admin only). Does not change visibility — use set_folder_access for that.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": null
        },
        {
          "name": "folderId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "title",
          "type": "string",
          "required": false,
          "description": null
        }
      ]
    },
    {
      "name": "update_memory_review",
      "title": "Confirm, reject, or edit a memory",
      "category": "Memories",
      "summary": "Confirm, reject, or edit an auto-extracted memory to correct how Knowcap recorded it.",
      "agentDescription": "Update the review status of an auto-extracted memory. Use \"confirm\" to keep, \"reject\" to mark as wrong, or \"edit\" with new summary/structured_data to correct it. Note: a confirm/edit made through this tool is recorded with confirmation_source=\"api_key\", not \"human\" — Knowcap distinguishes a named human's browser-session click from an API-key-authenticated caller (including an AI agent) confirming a memory. It will NOT satisfy verification_strictness=\"human_only\" elsewhere in the system; use this to correct clearly-wrong extractions, not as a substitute for a human review pass on high-stakes claims.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "action",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "memoryId",
          "type": "string",
          "required": true,
          "description": null
        },
        {
          "name": "structured_data",
          "type": "object",
          "required": false,
          "description": "Required when action=\"edit\" (alone or with summary)."
        },
        {
          "name": "summary",
          "type": "string",
          "required": false,
          "description": "Required when action=\"edit\" (alone or with structured_data)."
        }
      ]
    },
    {
      "name": "update_project",
      "title": "Update a Knowcap project",
      "category": "Projects",
      "summary": "Updates a project's name, description, or color.",
      "agentDescription": "Patch a project (name, description, color, etc.). For archive/unarchive use the dedicated tools.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "patch",
          "type": "object",
          "required": true,
          "description": null
        },
        {
          "name": "projectId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    },
    {
      "name": "update_source",
      "title": "Update a source",
      "category": "Sources",
      "summary": "Rename a source, change its status, replace its tags, or update its metadata. Tags you pass in replace the existing ones rather than adding to them.",
      "agentDescription": "Patch a source. Accepts any of: name, tags (string array — replaces, does not merge), status, metadata (merged shallow into existing). To clear tags pass an empty array. For AI-generated tags use generate_source_tags instead.",
      "destructive": false,
      "readOnly": false,
      "since": null,
      "parameters": [
        {
          "name": "patch",
          "type": "object",
          "required": true,
          "description": null
        },
        {
          "name": "sourceId",
          "type": "string",
          "required": true,
          "description": null
        }
      ]
    }
  ],
  "resources": [
    {
      "name": "knowcap-artifact",
      "uriTemplate": "knowcap://artifact/{id}",
      "description": "An AI-generated or user-created Knowcap artifact."
    },
    {
      "name": "knowcap-chat",
      "uriTemplate": "knowcap://chat/{id}",
      "description": "A chat thread inside a Knowcap project."
    },
    {
      "name": "knowcap-memory-decision",
      "uriTemplate": "knowcap://memory/decision/{id}",
      "description": "A decision memory extracted by Knowcap."
    },
    {
      "name": "knowcap-memory-task",
      "uriTemplate": "knowcap://memory/task/{id}",
      "description": "A task memory extracted by Knowcap."
    },
    {
      "name": "knowcap-project",
      "uriTemplate": "knowcap://project/{id}",
      "description": "A Knowcap project (workspace containing sources, memories, artifacts, chats)."
    },
    {
      "name": "knowcap-source",
      "uriTemplate": "knowcap://source/{id}",
      "description": "A Knowcap source: meeting, recording, or document."
    },
    {
      "name": "knowcap-speaker",
      "uriTemplate": "knowcap://speaker/{projectId}/{id}",
      "description": "A speaker identified across Knowcap recordings."
    },
    {
      "name": "knowcap-voiceprint",
      "uriTemplate": "knowcap://voiceprint/{id}",
      "description": "A voiceprint from the caller's personal voice library."
    }
  ],
  "prompts": [
    {
      "name": "knowcap-decision-log",
      "title": "Knowcap decision log",
      "description": "Chronological decision log for a project with rationale and source citations.",
      "arguments": [
        {
          "name": "projectId",
          "required": true,
          "description": "Knowcap project UUID."
        }
      ]
    },
    {
      "name": "knowcap-inbox-triage",
      "title": "Knowcap inbox triage",
      "description": "Walk the current Knowcap Inbox (sources with project_id=NULL) and propose a disposition for each: keep / archive / route-to-project. Powers the daily inbox-zero workflow.",
      "arguments": [
        {
          "name": "limit",
          "required": false,
          "description": "Max items to triage. Default 25. Use \"0\" to triage all."
        }
      ]
    },
    {
      "name": "knowcap-meeting-debrief",
      "title": "Knowcap meeting debrief",
      "description": "Produce a structured debrief of a Knowcap meeting/recording: agenda, decisions, tasks, risks, who said what — every reference linked to the timestamp in Knowcap.",
      "arguments": [
        {
          "name": "sourceId",
          "required": true,
          "description": "Knowcap source UUID (the meeting recording)."
        }
      ]
    },
    {
      "name": "knowcap-open-tasks",
      "title": "Knowcap open tasks",
      "description": "List open tasks across a project, grouped by source meeting, deadline-sorted.",
      "arguments": [
        {
          "name": "projectId",
          "required": true,
          "description": "Knowcap project UUID."
        },
        {
          "name": "assignee",
          "required": false,
          "description": "Filter to tasks assigned to this person."
        }
      ]
    },
    {
      "name": "knowcap-people-brief",
      "title": "Knowcap people brief",
      "description": "What is known about a person across a project: role, recent contributions, linked memories.",
      "arguments": [
        {
          "name": "projectId",
          "required": true,
          "description": "Knowcap project UUID."
        },
        {
          "name": "speakerId",
          "required": false,
          "description": "Optional Knowcap speaker UUID. If omitted, use name to filter."
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional name to match against speakers and memory entities."
        }
      ]
    },
    {
      "name": "knowcap-risks-watch",
      "title": "Knowcap risks watch",
      "description": "Open risks for a project ordered by severity.",
      "arguments": [
        {
          "name": "projectId",
          "required": true,
          "description": "Knowcap project UUID."
        }
      ]
    },
    {
      "name": "knowcap-share-bundle",
      "title": "Knowcap share bundle",
      "description": "List every active share link in a project (sources + artifacts) with token, expiry, and what it points at. Pre-built for security review or \"what is public right now?\" audits.",
      "arguments": [
        {
          "name": "projectId",
          "required": true,
          "description": "Knowcap project UUID."
        }
      ]
    },
    {
      "name": "knowcap-source-followups",
      "title": "Knowcap source follow-ups",
      "description": "Pull every task, risk, decision, and open question tied to one source/meeting, ordered by timestamp. The right \"what came out of this meeting and is still open\" report.",
      "arguments": [
        {
          "name": "sourceId",
          "required": true,
          "description": "Knowcap source UUID."
        }
      ]
    }
  ]
}