# MCP Tools

> The tools Claude can call through the MCP connector (Flow A). Distinct from agent *actions*.

_Verified against `app/Services/Ai/Mcp/McpToolRegistry.php` and `routes/api.php` on 2026-07-23._

---

## Model
- **Authoritative source:** `McpToolRegistry::tools()` maps each tool name → `{tier, title, description, schema, handler}`. This file is the single source of truth; the lists below are representative, not guaranteed exhaustive.
- Each handler **builds a sub-request and delegates to the existing REST controller** — the intended design is that dashboard, API, and MCP share one path with no duplicated business logic.
  - **Verified exception (2026-07-23):** the note write path does **not** follow this. `Api/V1/Ai/AiNoteWriteController` is a **separate** controller with its **own inline validation**, distinct from the dashboard's `Admin/NotesController` (they remain separate controllers). The note-body length invariant is now single-sourced via `EntityNote::BODY_MAX_LENGTH` (DR-009). Treat "single source of truth" as the **principle**, not a guarantee — verify per field. See the shared-invariant rule in [`../07-operation/change-management.md`](../07-operation/change-management.md).
- **Two tiers**, enforced by URL (`/api/v1/ai/mcp/read` vs `/mcp/full`): a read token cannot reach the full endpoint.
- Approximately **~70 tools total** (~30 read, ~40 full).

## Read tier (representative)
`investor_list`, `investor_search`, `investor_get`, `investor_find_gaps`, `investor_filter_dictionary`, `investor_meetings`, `startup_list`, `startup_search`, `startup_get`, `startup_find_gaps`, `startup_filter_dictionary`, `committee_list/get`, `demo_list/get`, `meeting_list/get`, `activity_log_list/get`, `notification_log_list/get`, `notification_retry_preview_{demo,committee}`, `tag_list`, `note_list_for_entity`, `label_option_list`, `task_summary/list`, `webinar_connection_status`, `enrichment_preview_proposals_list`, `file_list_for_{investor,startup}`, `file_get_content`.

## Full tier (representative — writes apply immediately)
`investor_update`, `investor_bulk_update`, `investor_set_preferences`, `startup_update`, `startup_bulk_update`, `startup_set_action`, `startup_member_*`, `startup_file_*`, `startup_set_geographic_focus`, `note_create/update`, `meeting_update_note/attendance`, `committee_*` (create/update/set_members/evaluations/slots/announce), `demo_*` (create/update/set_audience/slots/announce), `favorite_toggle`, `tag_update/upsert/attach_investor`, `task_start/resume`, `enrichment_run/preview`, `enrichment_preview_proposals_{approve,reject,bulk_approve}`, `investor_upload_avatar`, `startup_upload_logo`, `webinar_connection_{test,refresh,probe}`, `notification_retry_execute_{demo,committee}`.

> **Important:** `startup_set_action` (and investor equivalents) run the **full dashboard workflow** — group move + notifications + meeting cancel + audit. A "tool" write is a real business action, not a raw field poke.

> **Note deletion:** there is **no** `note_delete` tool by design — the AI/MCP surface is create/edit-only for notes. Deleting a note is an **admin-dashboard-only** capability (DR-010).

## Tools vs Actions
- **Tool** = an MCP function Claude calls directly (Flow A, immediate).
- **Agent Action** = a slug a managed agent *proposes* (Flow B), executed only after policy/approval. See [`actions.md`](actions.md).
