Kirah Local Services
REMOTE · KIRAH.AI · SCANNED SEP 20
Discover local services and availability, then create, track, reschedule, or cancel bookings.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (reschedule_booking). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3096 tokens (~309/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 76% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 10 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
How do I install the Kirah Local Services MCP server?
Kirah Local Services is a hosted endpoint at https://kirah.ai/api/mcp-registry-v1, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · kirah.ai
claude mcp add --transport http kirubel-kirah-local-services 'https://kirah.ai/api/mcp-registry-v1'
{
"mcpServers": {
"kirubel-kirah-local-services": {
"url": "https://kirah.ai/api/mcp-registry-v1"
}
}
} {
"servers": {
"kirubel-kirah-local-services": {
"type": "http",
"url": "https://kirah.ai/api/mcp-registry-v1"
}
}
} [mcp_servers.kirubel-kirah-local-services] url = "https://kirah.ai/api/mcp-registry-v1"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"kirubel-kirah-local-services": {
"type": "remote",
"url": "https://kirah.ai/api/mcp-registry-v1",
"enabled": true
}
}
} openclaw mcp add kirubel-kirah-local-services --url 'https://kirah.ai/api/mcp-registry-v1' --transport streamable-http
mcp_servers:
kirubel-kirah-local-services:
url: "https://kirah.ai/api/mcp-registry-v1" {
"McpServers": {
"kirubel-kirah-local-services": {
"Transport": "http",
"Url": "https://kirah.ai/api/mcp-registry-v1"
}
}
} assistant mcp add kirubel-kirah-local-services -t streamable-http -u 'https://kirah.ai/api/mcp-registry-v1'
{
"mcpServers": {
"kirubel-kirah-local-services": {
"type": "http",
"url": "https://kirah.ai/api/mcp-registry-v1"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Probed https://kirah.ai/api/mcp-registry-v1
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=kirah.ai | CN=YE1,O=Let's Encrypt,C=US | 7 Aug 2026 | 5 Nov 2026 | ECDSA 256 | ECDSA-SHA384 | 6738ca1679c7e7d25acb7a1be160db76adf |
| SANs: *.kirah.ai, kirah.ai | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of kirah.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| kirah.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=31536000 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://kirah.ai/api/mcp-registry-v1 | Verified | 200 | |
| http (plaintext) | http://kirah.ai/api/mcp-registry-v1 | HTTPS enforced | 301 | https://kirah.ai/api/mcp-registry-v1 |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
cancel_booking Cancel booking ~353
Cancels one grant-authorized booking after explicit user confirmation. Reusing idempotency_key makes retries safe. Kirah refuses cancellations that could refund a charged deposit or restore a paid plan session; an allowed cancellation has no undo.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_metadata | object | – | – |
| booking_ref | string | yes | The reference create_booking returned for the booking you want to CANCEL. It must be the SAME booking the supplied grant was issued for; a mismatch answers invalid_grant, indistinguishably from a for… |
| grant | string | yes | The capability token from this booking's create_booking response (confirmation.grant). Required: without it there is no way to establish that you are the agent that made this booking. It must carry t… |
| idempotency_key | string | yes | REQUIRED — unlike create_booking, this action cannot derive one, because "cancel booking X" is byte-identical whether it is a transport retry or a deliberate second call. Omitting it answers missing_… |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
| Name | Type | Req | Description |
|---|---|---|---|
| already_cancelled | boolean | – | – |
| appointment_id | string | – | – |
| booking_ref | string | – | – |
| booking_url | string | – | – |
| cancel_fee_cents | integer | – | – |
| confirmation | object | – | – |
| demo | boolean | – | – |
| demo_notice | string | – | – |
| deposit_cents | integer | – | – |
| detail | string | – | – |
| end_iso | string | – | – |
| grant | string | – | – |
| idempotent_replay | boolean | – | – |
| intake_form | – | – | – |
| missing | array | – | – |
| notified | string | – | – |
| outcome | string | yes | – |
| payment_url | string | – | – |
| policy_fee | string | – | – |
| policy_message | string | – | – |
| provider_name | string | – | – |
| reason | string | – | – |
| request_id | string | – | – |
| retry_after_sec | integer | – | – |
| service_name | string | – | – |
| start_iso | string | – | – |
| status_reason | string | – | – |
No examples provided.
create_booking Create booking ~291
Creates one guest booking for an exact service, provider and ISO-8601 start time after explicit user confirmation. Reusing idempotency_key makes retries safe. Kirah accepts no payment credentials through MCP; a deposit-required service may return a Kirah-hosted human payment continuation, but this call transfers no funds.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_metadata | object | – | – |
| client | object | yes | – |
| idempotency_key | string | – | – |
| intake_responses | object | – | Answers to the service's intake form (2.8), keyed by intake field id as advertised in list_services' service.intake_form.fields[].id. FLAT only: values must be a string, a boolean, or a finite number… |
| provider_id | string | – | – |
| service_id | string | yes | – |
| start_iso | string | yes | – |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
| Name | Type | Req | Description |
|---|---|---|---|
| already_cancelled | boolean | – | – |
| appointment_id | string | – | – |
| booking_ref | string | – | – |
| booking_url | string | – | – |
| cancel_fee_cents | integer | – | – |
| confirmation | object | – | – |
| demo | boolean | – | – |
| demo_notice | string | – | – |
| deposit_cents | integer | – | – |
| detail | string | – | – |
| end_iso | string | – | – |
| grant | string | – | – |
| idempotent_replay | boolean | – | – |
| intake_form | – | – | – |
| missing | array | – | – |
| notified | string | – | – |
| outcome | string | yes | – |
| payment_url | string | – | – |
| policy_fee | string | – | – |
| policy_message | string | – | – |
| provider_name | string | – | – |
| reason | string | – | – |
| request_id | string | – | – |
| retry_after_sec | integer | – | – |
| service_name | string | – | – |
| start_iso | string | – | – |
| status_reason | string | – | – |
No examples provided.
find_available_services Find available services (earliest openings) ~410
Checks up to five top matching eligible Kirah businesses for earliest current availability within an exact ISO-8601 window of up to 14 days. Returns checked status and a partial-coverage flag.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_limit | integer | – | How many top-matching businesses get LIVE availability checks (invalid_candidate_limit outside 1-5). This bounds the whole fan-out: businesses beyond it are never touched, and partial:true says so. |
| earliest_after | string | – | Exact ISO 8601 instant the window opens (default: now). Natural-language times are rejected (invalid_earliest_after). |
| earliest_before | string | – | Exact ISO 8601 instant the window closes (default: earliest_after + 14 days). Must be after earliest_after and at most 14 days after it (invalid_earliest_before). |
| include_demo | boolean | – | Back-compat alias: true is equivalent to tenant_mode 'include_demos' and false to 'real_only'. When omitted, tenant_mode defaults to include_demos. Every demo candidate carries demo:true and a demo_n… |
| location | string | – | Optional place text ('City, ST', ZIP, bare city/state) OR explicit coordinates 'lat,lng' — identical semantics to search_businesses.location. |
| max_price_cents | integer | – | Only candidate services with a parseable price at or under this amount are considered. |
| query | string | yes | The consumer's service need in plain words — identical semantics to search_businesses.query. |
| radius_miles | integer | – | Radius in miles (default 25) — operative when the location resolves to coordinates (2.6 semantics). |
| tenant_mode | string | – | The authoritative demo eligibility filter, with the same semantics as search_businesses. include_demos is the default and returns real and demo candidates; real_only excludes demos; demos_only return… |
Structured output declared, but exposes no named fields.
No examples provided.
get_availability Get availability ~119
Returns current open times for one exact service and optional provider over a YYYY-MM-DD range of up to 31 days, with at most 20 rows. Approval-mode times are preferences rather than holds.
| Name | Type | Req | Description |
|---|---|---|---|
| date_range | object | yes | – |
| provider_id | string | – | – |
| service_id | string | yes | – |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
Structured output declared, but exposes no named fields.
No examples provided.
get_booking_status Get booking status ~157
Returns the current status, time, service and provider for one grant-authorized booking reference. Client contact details and intake responses are excluded.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_ref | string | yes | The reference create_booking returned (its idempotency key). Tampered, unrelated, cross-tenant or never-committed references answer one indistinguishable booking_not_found. |
| grant | string | – | The booking-bound capability token returned by create_booking. It must match this tenant and booking_ref and remain unexpired and unrevoked. |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
Structured output declared, but exposes no named fields.
No examples provided.
get_reschedule_options Get reschedule options ~435
Returns up to five real alternate times and the current fee or approval consequences for one grant-authorized booking. It does not hold, move or cancel the appointment.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_ref | string | yes | The reference create_booking returned (its idempotency key). It must be the SAME booking the supplied grant was issued for; a mismatch answers invalid_grant, indistinguishably from a forged grant. |
| earliest | string | – | Optional exact ISO 8601 instant — the earliest replacement time to consider. Default: now + 2 hours (a slot the customer cannot physically reach is not an option). Natural-language times are not acce… |
| grant | string | yes | The capability token from this booking's create_booking response (confirmation.grant). Required: without it there is no way to establish that you are the agent that made this booking. Tampered, wrong… |
| latest | string | – | Optional exact ISO 8601 instant — the latest replacement time to consider. Default: now + 14 days. Must be after `earliest` and at most 31 days after it; anything else answers invalid_latest. Supply… |
| limit | integer | – | How many options to return. Default 2, hard maximum 5; a larger value is CLAMPED to 5 rather than rejected. The ceiling is deliberate: the primary consumer is a voice agent reading options aloud, and… |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
Structured output declared, but exposes no named fields.
No examples provided.
list_services List services ~84
Returns one published Kirah business catalog with current services, providers, timezone, prices, durations, deposit requirements, intake-question definitions and derived booking capabilities.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
Structured output declared, but exposes no named fields.
No examples provided.
reschedule_booking Reschedule booking ~572
Atomically moves one grant-authorized booking to a real open time after explicit user confirmation. Reusing idempotency_key makes retries safe. Failure leaves the original booking unchanged; success returns a rotated grant.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_metadata | object | – | – |
| booking_ref | string | yes | The reference create_booking returned for the booking you want to MOVE. It must be the SAME booking the supplied grant was issued for; a mismatch answers invalid_grant, indistinguishably from a forge… |
| grant | string | yes | The capability token from this booking's create_booking response (confirmation.grant). Required: without it there is no way to establish that you are the agent that made this booking. It must carry t… |
| idempotency_key | string | yes | REQUIRED — unlike create_booking, this action cannot derive one, because "move booking X to time T" is byte-identical whether it is a retry or a deliberate second move. Omitting it answers missing_id… |
| provider_id | string | – | OPTIONAL. Move the booking to a different provider. Omit it and the booking keeps the provider it is already on — the customer booked a person, not a room. An explicit provider is honored only when t… |
| start_iso | string | yes | The exact ISO 8601 instant to move the appointment to. Natural-language times are not accepted. You may supply it DIRECTLY — calling get_reschedule_options first is optional, not required — because t… |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
| Name | Type | Req | Description |
|---|---|---|---|
| already_cancelled | boolean | – | – |
| appointment_id | string | – | – |
| booking_ref | string | – | – |
| booking_url | string | – | – |
| cancel_fee_cents | integer | – | – |
| confirmation | object | – | – |
| demo | boolean | – | – |
| demo_notice | string | – | – |
| deposit_cents | integer | – | – |
| detail | string | – | – |
| end_iso | string | – | – |
| grant | string | – | – |
| idempotent_replay | boolean | – | – |
| intake_form | – | – | – |
| missing | array | – | – |
| notified | string | – | – |
| outcome | string | yes | – |
| payment_url | string | – | – |
| policy_fee | string | – | – |
| policy_message | string | – | – |
| provider_name | string | – | – |
| reason | string | – | – |
| request_id | string | – | – |
| retry_after_sec | integer | – | – |
| service_name | string | – | – |
| start_iso | string | – | – |
| status_reason | string | – | – |
No examples provided.
search_businesses Search Kirah businesses ~500
Searches Kirah's eligible public business directory by service need or exact Kirah Agent Address, with optional coarse location, price and demo-mode filters. Demo results are explicitly labeled.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_address | string | – | Exact public locator `<handle>@kirah.ai`; case-insensitive ASCII only. A locator, never authentication or owner authority. Reserved, malformed, unlisted, disabled, non-bookable, and tenant_mode-ineli… |
| cursor | string | – | Opaque next_cursor value from a previous search_businesses response with the SAME query/filters: resumes after that tenant in the stable ordering. A cursor that does not decode, or that names a tenan… |
| include_demo | boolean | – | Back-compat alias: true is equivalent to tenant_mode 'include_demos' and false to 'real_only'. When omitted, tenant_mode defaults to include_demos. Every demo result carries demo:true and a demo_noti… |
| limit | integer | – | – |
| location | string | – | Optional place text ('City, ST', ZIP, bare city/state) OR explicit coordinates 'lat,lng'. With resolvable coordinates, radius_miles applies as real distance; otherwise matching is city/ZIP/metro-mark… |
| max_price_cents | integer | – | Only services with a parseable price at or under this amount are returned; unpriced services are excluded when this is set. |
| query | string | – | The consumer's need in plain words (e.g. 'lower back tightness', 'prenatal massage'). Matched deterministically against real service catalogs, expanded by the discovery ontology. |
| radius_miles | integer | – | Radius in miles (default 25) — OPERATIVE when the location resolves to coordinates (2.6); otherwise answered with a truthful distance_note instead of a fabricated distance. |
| tenant_mode | string | – | The authoritative eligibility filter for demo tenants. include_demos (default) returns real and demo businesses together; every demo is flagged demo:true and carries a clear notice. real_only exclude… |
Structured output declared, but exposes no named fields.
No examples provided.
search_services Search services ~95
Ranks up to five services in one published Kirah business catalog against a short free-text query. Returns catalog-grounded candidate identifiers, names, scores and match evidence.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | – |
| tenant | string | yes | The tenant to operate on: the provider.tenant_slug value from the tenant's /.well-known/kirah.json manifest (the tenant's full domain, e.g. <slug>.kirah.ai). |
Structured output declared, but exposes no named fields.
No examples provided.
What is the Kirah Local Services MCP server?
Kirah Local Services is an MCP server listed in the public MCP registry as io.github.kirubel/kirah-local-services. Discover local services and availability, then create, track, reschedule, or cancel bookings. This page covers its hosted endpoint (https://kirah.ai/api/mcp-registry-v1).
Is the Kirah Local Services MCP server safe to use?
Kirah Local Services scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Kirah Local Services MCP server expose?
Kirah Local Services exposes 10 tools: list_services, search_services, get_availability, search_businesses, find_available_services, and 5 more. Their descriptions and schemas cost roughly 3,016 tokens of context every time the server is loaded.
Does the Kirah Local Services MCP server require authentication?
No. We connected to Kirah Local Services without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Kirah Local Services MCP server still maintained?
Kirah Local Services is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.