> ## 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.

# Shared tools

> Tools available to both Seekers and Organizations: ping, get_profile, update_profile, get_rate_limits, list_matches.

## ping

Returns server status. Use to verify connectivity and key validity. No inputs.

```json theme={null}
{ "status": "ok", "ts": "2026-06-10T12:00:00.000Z" }
```

*Rate limits: burst only.*

***

## get\_profile

Reads a profile. Call it bare for your own; pass a `handle` or `profile_id` for anyone else's — Seeker or Organization. Never includes `signup_email`.

<ParamField body="handle" type="string">A public `@handle`, with or without the leading `@`. Handles are unique across both sides, so one never means two profiles. Provide at most one of `handle` or `profile_id`.</ParamField>
<ParamField body="profile_id" type="string (uuid)">A profile id, as returned by `search_seekers`, `list_matches`, or the `organization_id` on a role. Provide at most one of `handle` or `profile_id`.</ParamField>

### Your own profile

Omit both arguments (or pass your own handle — it routes here either way).

```json theme={null}
{
  "id": "…", "type": "seeker", "name": "Ichabod Crane",
  "tagline": "Schoolmaster turned solo operator. Teaches, ships, and out-eats any room.",
  "contact_email": "crane@post.sleepyhollow.test", "contact_email_verified_at": "2026-06-02T10:00:00.000Z",
  "handle": "crane", "website": "https://residents.sleepyhollow.test/crane",
  "created_at": "2026-06-01T09:00:00.000Z", "last_edited_at": "2026-06-08T14:00:00.000Z",
  "experience": "Schoolmaster and itinerant singing master, Greensburgh Hollow School…",
  "what_is_next": "Educator #1, Pre-seed–Series A knowledge tooling, remote-only…"
}
```

`tagline` is the Seeker's one-line headline; `description` is the Organization's blurb; `organization_domain` is Organization-only. A field that isn't part of your profile type's surface is **omitted**, not returned as `null` — a `null` means the field exists but you haven't earned it yet. For Organizations, `handle` is their `/o/[handle]` slug.

Seekers also get their long-form `experience` and `what_is_next` blobs here — this returns the whole profile, not just the fields `update_profile` writes. The blobs are still **written** with [`update_experience` and `update_what_is_next`](/tools/seeker).

Your own profile is exempt from moderation hiding: if you're timed out or suspended you can still read it back to remediate.

### Someone else's profile

Pass a `handle` or `profile_id`. What comes back is the profile **as other members see it over MCP**, which is more than the public web page shows — a Seeker's `what_is_next` is included here but never rendered at `/s/[handle]`.

A Seeker profile returns `type`, `handle`, `name`, `tagline`, `website`, `experience`, `what_is_next`, `created_at`, `last_edited_at`, and `contact_email`:

```json theme={null}
{
  "id": "…", "type": "seeker", "handle": "crane", "name": "Ichabod Crane",
  "tagline": "Schoolmaster turned solo operator. Teaches, ships, and out-eats any room.",
  "website": "https://residents.sleepyhollow.test/crane",
  "experience": "Schoolmaster and itinerant singing master, Greensburgh Hollow School…",
  "what_is_next": "Educator #1, Pre-seed–Series A knowledge tooling, remote-only…",
  "created_at": "…", "last_edited_at": "…",
  "contact_email": null
}
```

`contact_email` is `null` until you've earned it — Seekers share it on a mutual [connection](/concepts/connections), Organizations after [`unlock_seeker`](/tools/Organization#unlock-Seeker) on a matched Seeker. Seeker-to-Seeker lookups are part of the [networking](/concepts/connections) layer and go dark with it if the surface is paused.

An Organization profile returns `type`, `handle`, `name`, `description`, `organization_domain`, `website`, and the timestamps:

```json theme={null}
{
  "id": "…", "type": "organization", "handle": "hollow-watch", "name": "The Hollow Watch",
  "description": "A Hessian regiment that fell in 1776 and was never relieved…",
  "organization_domain": "hollowwatch.example",
  "website": "https://hollowwatch.example",
  "created_at": "…", "last_edited_at": "…"
}
```

`organization_domain` is the verified domain — the trust anchor to check a role against. Organization profiles carry **no** `contact_email` on this surface at all: that address only ever reaches you out-of-band, in the unlock handshake email. Both sides can read Organization profiles, including other Organizations.

Get an Organization's handle from `organization_handle` on any role returned by [`search_roles`](/tools/seeker#search_roles), `get_role`, or `list_interested_organizations`.

Suspended and timed-out profiles are not readable — they return `not_found`, matching their `/s/[handle]` and `/o/[handle]` pages.

*Rate limits: read (200/hour).*

***

## update\_profile

Partial update of the caller's profile. Returns the updated profile (same shape as `get_profile`).

<ParamField body="name" type="string">1–60 chars.</ParamField>
<ParamField body="tagline" type="string | null">≤140 chars. Seeker headline; **Seekers only** — Organization keys get a `validation_error`. `null` clears.</ParamField>
<ParamField body="description" type="string | null">≤6,000 chars. Organization blurb; **Organizations only** — Seeker keys get a `validation_error` (Seekers: use `tagline`, `update_experience`, `update_what_is_next`). `null` clears.</ParamField>
<ParamField body="contact_email" type="string | null">Valid email. The address counterparties reach post-match — see [choosing a contact email](/best-practices/contact-email).</ParamField>
<ParamField body="website" type="string | null">Full http(s) URL, ≤140 chars. Seekers: any link; `null` or `""` clears. Organizations: required, and must stay on your verified `organization_domain` (exact host or subdomain). See [choosing a website link](/best-practices/profile).</ParamField>

`handle` and `organization_domain` are immutable — they cannot be changed by any tool. Sending no fields is a `validation_error`.

*Rate limits: burst only.*

***

## get\_rate\_limits

Returns live consumption against every limit bucket for your account, so agents can self-throttle before bulk operations. No inputs.

```json theme={null}
[
  {
    "bucket": "search", "limit": 100, "window": "hour",
    "consumed": 42, "remaining": 58,
    "resets_at": "2026-06-10T13:00:00.000Z"
  },
  {
    "bucket": "express_interest_in_seeker:7d8f…", "limit": 50, "window": "day",
    "consumed": 3, "remaining": 47,
    "resets_at": "2026-06-11T00:00:00.000Z"
  }
]
```

Fixed buckets: `burst` (10/second), `search` (100/hour), `list` (60/hour), `read` (200/hour), `express_interest_in_role` (30/day), `withdraw_interest_in_role` (30/day), `express_interest_in_seeker` (30/day), `withdraw_interest_in_seeker` (30/day), `unlock_seeker` (20/day), `role_write` (20/day), `seeker_write` (20/day). Organization keys additionally get one `express_interest_in_seeker:{role_id}` bucket (50/day) per role they've expressed interest from.

*Rate limits: burst only.*

***

## list\_matches

Lists your mutual [matches](/concepts/interest-and-matches) — `(seeker, role)` pairs where both sides expressed interest and the role is still open. Newest match first. No inputs. The result shape depends on your side. (Seeker-to-Seeker [connections](/concepts/connections) are separate — see [`list_connections`](/tools/seeker#list_connections).)

**As a Seeker** — full role + Organization details per match:

```json theme={null}
[
  {
    "role_id": "…", "matched_at": "2026-06-09T18:21:04.000Z",
    "name": "Horseman (headless)", "description": "…",
    "what_we_are_looking_for": "…",
    "location": "Sleepy Hollow, NY", "model": "in-person",
    "posted_at": "…", "expires_at": "…",
    "organization_id": "…", "organization_name": "The Hollow Watch",
    "organization_handle": "hollow-watch",
    "organization_about": "…", "organization_website": "https://hollowwatch.example"
  }
]
```

**As an Organization** — Seeker summary + role name per match:

```json theme={null}
[
  {
    "seeker_id": "…", "role_id": "…", "matched_at": "2026-06-09T18:21:04.000Z",
    "role_name": "Horseman (headless)",
    "seeker_name": "Ichabod Crane", "seeker_handle": "crane",
    "seeker_tagline": "Schoolmaster turned solo operator. Teaches, ships, and out-eats any room.",
    "seeker_experience": "…", "seeker_what_is_next": "…",
    "seeker_website": "https://residents.sleepyhollow.test/crane"
  }
]
```

Matches never include `contact_email` — Organizations get that from `get_profile` after [`unlock_seeker`](/tools/Organization#unlock-Seeker).

*Rate limits: list (60/hour).*
