Connect to Claude
One-click install the Kifly MCP server into Claude Desktop or Claude.ai.
You'll be prompted for your Kifly agent key. Generate one at /dashboard/api-keys.
Kifly MCP Integration Guide
Connect any MCP-compatible agent to Kifly's live product catalog using the Model Context Protocol over HTTP.
Endpoint
https://kifly.ai/api/mcp
Stateless StreamableHTTP transport. Every request is independent — no session state is held server-side between calls.
Authentication
Pick the credential by what you're building, not by what's simplest. The paths return different data, and getting this wrong is silent — the wrong key doesn't error, it just quietly shows you less than the whole network.
| You're building | Use | Sees |
|---|---|---|
| An agent, and you want to start right now | Nothing. Declare the UCP profile your agent publishes about itself | The whole network: search, sellers, carts. See "No credential at all" below. |
| An integration against your own store | A seller API key (kfa_live_) | That store only. Cannot be upgraded to network scope. |
| A buyer agent that shops on a person's behalf | OAuth 2.1 (below) | The whole network. No Kifly account required to register. |
| A headless agent with no human present at connect time | A network key (kfn_live_) | The whole network. See "Network keys" below. |
No credential at all — the open UCP surface
If you are building an agent, you need nothing from us to start. Send the canonical UCP caller-identity field and call us:
{
"method": "tools/call",
"params": {
"name": "search_products",
"arguments": {
"q": "gold scrub",
"meta": { "ucp-agent": { "profile": "https://your-agent.example/.well-known/ucp" } }
}
}
}
On REST, the same identity is the UCP-Agent header.
- What it is.
meta.ucp-agent.profileis the UCP spec's own field (ucp.dev2026-08-25), not a Kifly invention. It is the URL of a profile document your agent publishes about itself. - It is attribution, not authentication. It identifies your agent so calls can be attributed and rate-limited per agent.
- What you can do: search the network, read sellers, build a cart, set a shipping address, and request a payment link a human confirms.
- What needs a key: buyer identity, order history, and autonomous
settlement. No tool call ever completes a purchase —
checkoutreturns a link a person confirms. - Limits: open callers are rate-limited per profile (an API key raises it).
Over the limit you get
429withRetry-After. - Optional signing. Sign the HTTP request that carries your
tools/call(RFC 9421) using a key in your profile'skeys[], and Kifly recognises you as yourself. Details at https://kifly.ai/docs/rest. - Optional buyer context. Add
"ai.kifly.buyer": { "ref": "<opaque user id>", "session": "<conversation id>" }tometa. Send an opaque id, never an email. Details at https://kifly.ai/docs/rest. - Publish the profile on a domain you control.
your-agent.exampleis a placeholder; reserved names and bare IPs cannot be verified. They work today and each result says so inresult._meta["ai.kifly/advisories"], which is where Kifly tells you anything to fix without refusing the call. - Supported tools without a credential:
search_products,list_sellers,get_seller,create_cart,get_cart,add_to_cart,update_cart_item,set_shipping_address,quick_buy,get_help,get_platform_limits,submit_feedback. Anything else returns401and names what it needs. - You do not have to read this page to find any of that out. Everything
above is machine-readable at
/.well-known/ucp: theai.kifly.open-accesscapability carries the field to send, the tool list, the rate limit and the scope ceiling, and every entry inendpointsstates which credential it needs (none,openoragent_token). Read the profile, not the prose. 403 AGENT_DENIEDmeans access for that profile has been withdrawn, which is different from a rate limit. Mail hello@kifly.ai.- Tell us when we fail you.
submit_feedbackneeds no credential either — send yourucp-agent.profileand file it. If a response confused you, a capability was missing, or you had to invent a workaround, that is the most useful thing you can send us, and a human reads every report. We would rather have the complaint than the silence.
Seller API key (kfa_live_) — your own store only
Generate one from the Kifly seller dashboard → Developer → API Keys. It authenticates as your store and only ever returns your catalog. Requesting network scope on this key type is rejected at creation. If your agent needs to discover products across multiple sellers, this is the wrong key — use OAuth or a network key instead.
Authorization: Bearer kfa_live_xxxxxxxxxxxxxxxx
OAuth 2.1 — cross-network, per-user consent
Kifly runs a full OAuth 2.1 server with open dynamic client registration — no Kifly seller account needed to register a client, and no storefront of your own. This is the right choice for a buyer agent acting on behalf of a person who is present to consent.
| Endpoint | URL |
|---|---|
| Authorization server metadata | https://kifly.ai/.well-known/oauth-authorization-server |
| Dynamic client registration | https://kifly.ai/oauth/register |
| Authorization | https://kifly.ai/oauth/authorize |
| Token | https://kifly.ai/oauth/token |
PKCE S256 required. Refresh tokens rotate on each use. This is what claude.ai and other OAuth-requiring hosts negotiate automatically.
Network keys (kfn_live_) — headless agents, no human at connect time
If your agent runs unattended — no human in the loop to complete an OAuth consent screen — mint a network key instead:
POST /api/developer/network-keys
Authorization: <your Kifly session>
Content-Type: application/json
{ "name": "my-agent", "scopes": ["catalog:read:network", "cart:write", "checkout:write", "order:read", "buyer:write"] }
Returns a kfn_live_ token. It is a network-wide key, not tied to any one store. List and revoke your keys at GET/DELETE on the same path. Key issuance is rate-limited and capped per account — see Platform Limits; revoke unused keys.
No storefront required. Sign up at kifly.ai/dashboard/onboarding and choose "Building an agent instead of a store?" — a developer account registers with just a name and handle and cannot publish products or take payouts. If you'd rather build against your own store, use a seller account with Developer Mode enabled instead (Dashboard → Developer → API Keys → "Enable developer mode") — either path lands here.
Authorization: Bearer kfn_live_xxxxxxxxxxxxxxxx
Connecting to your agent runtime
Each MCP host has its own process for registering an external MCP server, and these interfaces change frequently. Rather than walk you through steps that may already be out of date, we give you everything Kifly requires and link to each platform's official docs.
Server URL:
https://kifly.ai/api/mcp
Transport: StreamableHTTP (remote)
Authentication header (for hosts that let you set custom headers) — use whichever key type fits from the table above:
Authorization: Bearer kfa_live_xxxxxxxxxxxxxxxx # your own store only
Authorization: Bearer kfn_live_xxxxxxxxxxxxxxxx # whole network, headless
Hosts that require OAuth 2.1 (like claude.ai) negotiate it automatically — no header needed.
Claude — claude.ai web app
Use the one-click install button at the top of this page, or follow Anthropic's official guide:
→ Get started with custom connectors using remote MCP
Claude Desktop
→ Getting started with local MCP servers on Claude Desktop
Gemini / Google AI Studio
MCP support in Gemini is available at the API/SDK level. See Google's official documentation:
→ Gemini API — Deep Research & remote MCP tools
Other MCP-compatible runtimes
Use the server URL and auth header above. Most MCP hosts follow the same pattern — consult your runtime's official documentation for the exact steps.
Platform limits resource
At session start, read the kifly://platform/limits resource to know the current cart constraints before you begin a purchase flow:
{
"max_item_quantity": 20,
"max_cart_total_cents": 100000,
"max_cart_total_usd": "1000.00"
}
These values are live — they may change without a code deploy. Exceeding max_item_quantity returns 400 quantity_exceeds_limit; exceeding the cart total returns 400 cart_total_exceeds_limit at checkout.
Available Tools (21)
Discovery
| Tool | Scopes | Description |
|---|---|---|
search_products | catalog:read | Semantic, multilingual search. Supports filters: limit, sort_by, min_price_cents, max_price_cents, in_stock_only, category, delivers_to (sellers that deliver to a country, region or city). facets: true adds counts by category, seller, price band and stock. Omit q to browse recent listings. |
get_seller | catalog:read | Seller profile: name, location, delivery_coverage (states + cities), delivery_fee_cents, catalog_size. Call before create_cart to pre-screen delivery eligibility. |
list_sellers | catalog:read | Enumerate sellers across the network — handle, name, city, region, delivery coverage, catalog_size. Cursor-paginated. Available to network (kfn_live_) tokens for cross-seller discovery. |
Cart lifecycle
| Tool | Scopes | Description |
|---|---|---|
create_cart | cart:write | Create a cart. Pass seller_handle for network tokens. Returns cart_id. |
add_to_cart | cart:write | Add a variant by variant_id and quantity. Returns updated cart state including item_ids. |
get_cart | cart:write | Inspect the cart: line items, quantities, price snapshots, subtotal, shipping address. |
update_cart_item | cart:write | Change a line item's quantity. Pass quantity: 0 to remove the item. |
set_shipping_address | cart:write | Required before checkout. Validates delivery, returns delivery_eligible, delivery_coverage (on failure), and cart_total_with_delivery_cents (on success). |
checkout | checkout:write | Generate a Stripe Payment Link. Returns payment_url, session_id, and the full cost breakdown. |
order_status | checkout:write | Poll session status: pending → paid → shipped. When shipped: tracking_number, carrier, shipped_at. |
Buyer identity
| Tool | Scopes | Description |
|---|---|---|
register_buyer | buyer:write | Start registering a buyer by email + name. Emails a 6-digit code and returns { verification_required: true }. Follow with verify_buyer to get the kfb_live_... token. |
request_buyer_code | buyer:write | Email a returning buyer a 6-digit code so they can recover their saved profile on a new connection without pasting a token or re-entering their name. |
verify_buyer | buyer:write | Verify the 6-digit code from either register_buyer or request_buyer_code; returns a fresh kfb_live_... buyer_token bound to the buyer's global profile. |
get_buyer_profile | order:read | Retrieve a repeat buyer's name, email, and default shipping address from their kfb_live_... token. |
save_buyer_address | cart:write | Save the order's shipping address to the buyer's profile so it auto-fills next time. |
Platform & support
| Tool | Scopes | Description |
|---|---|---|
get_platform_limits | (any) | Read the current cart constraints (max_item_quantity, max_cart_total_cents) so the agent can pace itself before building a cart. Same values as the kifly://platform/limits resource. |
get_help | (any) | Inline integration guidance — the recommended flow, common errors, and next steps — so an agent can self-correct without leaving the session. |
submit_feedback | (any) | Structured feedback to the Kifly team. Fire-and-forget (202). Rate-limited to 10/min. |
request_feature | (any) + buyer token | A buyer's structured product/feature request (problem / impact / proposed fix). Requires the buyer's kfb_live_ token. Fire-and-forget (202). Rate-limited to 5/min. |
Recommended purchase flow
[1] read kifly://platform/limits (know the quantity + total caps)
[2] get_seller (optional — validate delivery coverage early)
[3] get_buyer_profile (returning buyer who already has a kfb_live_ token)
OR request_buyer_code + verify_buyer (returning buyer — recover by email, no token)
OR register_buyer + verify_buyer (new buyer — both end with a token to store)
[4] search_products
[5] create_cart
[6] add_to_cart (repeat for each item)
[7] get_cart (optional — review before asking for address)
[8] set_shipping_address → confirms delivery + returns total with delivery fee
[9] checkout → returns payment_url
[10] buyer pays at payment_url
[11] order_status (poll every 5s until paid or shipped)
[12] save_buyer_address (if get_buyer_profile returned null default_shipping_address)
set_shipping_address
{
"cart_id": "cart_…",
"shipping_address": {
"name": "Ada Lovelace",
"line1": "123 Market St",
"city": "San Francisco",
"region": "CA",
"postal_code": "94103",
"country": "US"
}
}
Returns delivery_eligible, cart_total_with_delivery_cents, and (when ineligible) the seller's delivery_coverage so you can tell the buyer which states and cities are covered. When shipping_priced_at is merchant_checkout, the seller's own checkout prices shipping: delivery_fee_cents and cart_total_with_delivery_cents are null, so quote the subtotal and say shipping is calculated at checkout.
Rate Limits
| Surface | Limit |
|---|---|
/api/mcp | 120 requests / 60 seconds per token |
/api/agent/* | 60 requests / 60 seconds per token |
/api/agent/feedback | 10 requests / 60 seconds per token |
Responses include x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset headers. Limit breaches return 429 with a retry-after header.