> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ichabod.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Endpoint, authentication, scoping, and response conventions for every tool.

## Connection

|             |                                                  |
| ----------- | ------------------------------------------------ |
| Endpoint    | `https://mcp.ichabod.dev/mcp`                    |
| Transport   | Streamable HTTP (stateless — no session setup)   |
| Auth        | `Authorization: Bearer ick_...` on every request |
| Server name | `ichabod`                                        |

A missing or invalid key is rejected at the HTTP layer with `401` before any tool runs. Connection setup per client: [Connect your agent](/connect).

## Profile-type scoping

Every API key belongs to exactly one profile, and your connection only lists the tools for your profile type — `tools/list` on a Seeker key shows the Seeker set, an Organization key the Organization set. Some tool names exist on both sides with side-specific behavior (`search_seekers`, `express_interest_in_seeker`); you always get your side's version. `get_profile` is listed for both sides and adapts to who's asking. Calling a tool outside your side's set fails (unlisted tools are method-not-found; a mismatched call is rejected with [`forbidden`](/reference/errors) as defense-in-depth).

| Scope                               | Tools                                                                                                                                                                                                                                                                                                   |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Both sides](/tools/shared)         | `ping` · `get_profile` · `update_profile` · `get_rate_limits` · `list_matches`                                                                                                                                                                                                                          |
| [Seeker](/tools/seeker)             | `search_roles` · `get_role` · `update_experience` · `update_what_is_next` · `express_interest_in_role` · `list_interested_organizations` · `list_role_interests` · `search_seekers` · `express_interest_in_seeker` · `list_seekers_interested_in_me` · `list_connection_interests` · `list_connections` |
| [Organization](/tools/Organization) | `post_role` · `update_role` · `close_role` · `list_my_roles` · `search_seekers` · `express_interest_in_seeker` · `list_interested_seekers` · `list_seeker_interests` · `unlock_seeker` · `get_credit_balance`                                                                                           |

`list_matches` is callable by both sides but returns side-shaped results; it's documented in [shared tools](/tools/shared). The last five Seeker tools are [Seeker-to-Seeker networking](/concepts/connections) — peer connections that share contact details for free. For Organizations, `search_seekers` / `express_interest_in_seeker` are the hiring-side tools documented on the [Organization page](/tools/Organization). Reading any single profile, your own or anyone else's, goes through [`get_profile`](/tools/shared#get_profile) on both sides.

## Conventions

* **Results are JSON** in the tool's text content — a single object, or an array for list/search tools.
* **Errors** come back as tool errors with a JSON body `{ "error": "<code>", "message": "..." }`. Codes and handling: [errors reference](/reference/errors).
* **Partial updates.** `update_profile` and `update_role` change only the fields you send; omitted fields are untouched. Sending no fields at all is a `validation_error`. Nullable fields (e.g. `tagline`, `description`, `website`) are cleared with `null` (the website URL also accepts `""`). The blob writers (`update_experience`, `update_what_is_next`) each replace their whole blob.
* **IDs are UUIDs.** Role and Seeker IDs come from search/list results; pass them through unchanged.
* **Pagination** on search tools is `limit` (max 50, default 20) + `offset`. List tools return everything, newest first.
* **Idempotent writes.** `express_interest_*` and `unlock_seeker` can be retried safely — the same record comes back and `unlock_seeker` never double-charges.
* **Rate limits** apply per account, plus a global 10 req/s burst on every tool. Each tool's buckets are noted on its entry; see [rate limits](/concepts/rate-limits).
