# io.github.whalefuntech/intentlink

> The best agent monetization tool: free search, clear rev-share, 10M+ commerce/travel/local offers.

- name: io.github.whalefuntech/intentlink
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 94/100
- quality: 76/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.whalefuntech%2Fintentlink
- tools: https://api.protogrid.dev/v1/servers/io.github.whalefuntech%2Fintentlink/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "intentlink": {
      "type": "http",
      "url": "https://api.intentlink.io/mcp/"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 85
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-100% ~updated-90d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 76/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 64 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 3 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: search_travel (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); search_events (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); search_products (readOnlyHint, destructiveHint, idempotentHint, openWorldHint)
- pass `tools.token_cost`: about 1,986 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 3, about 1,986 tokens to load them all
- tool set hash: 67c7c4c6592cd7b6eae967e5b5a0bbc9
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.whalefuntech/intentlink.svg)](https://protogrid.dev/servers/io.github.whalefuntech/intentlink)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://api.intentlink.io/mcp/ (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (3)

- `search_events`: Search live ticketing/events (concerts, sports, theater) and get ranked event bundles.

Only `query` is required — a natural-language description of what the buyer wants
(e.g. "taylor swift concert near LA this summer"). Add fields to narrow results:
  - keywords: exact terms — performer / team / show / venue (a precise lookup).
  - categories: e.g. ["Concerts"|"Sports"|"Theater"] (read the `events://categories`
    resource for valid values).
  - city / state: location (e.g. city="Los Angeles", state="CA"). country defaults to US.
  - date_from / date_to: explicit date window, YYYY-MM-DD (event dates are date-only).
  - when: fuzzy time — "this_weekend" | "this_week" | "this_month" | "next_7_days" |
    "next_30_days" (ignored if date_from/date_to are given).
  - min_price / max_price: ticket 'from' price band (USD).
  - sort: "relevance" (default) | "soonest" | "cheapest".
  - limit: max results (default 10).

`agent_id` is REQUIRED: your registered, active agent id — the attribution + access key. A
missing/blank or unregistered agent_id is rejected (no anonymous use).

Returns {count, message, events:[{bundle_id,title,venue,city,next_date,price_min,...,
sessions:[{date,price,buy_url,landing_url}]}]}. Each session's `buy_url` is ALREADY the
trackable ticket link — hand it to the buyer directly. `landing_url` is the plain event
page. When a date filter is given, `sessions` are the in-window dates.
- `search_products`: Search affiliate shopping products and get ranked recommendations.

Only `query` is required — a natural-language description of what the shopper wants
(e.g. "a warm waterproof jacket for winter hiking"). Add fields to narrow results:
  - keywords: exact product terms. Use a SPECIFIC product type ("women running shoes",
    "stainless steel knife set"), not a bare generic noun ("shoes", "knife") — a generic
    keyword can surface the wrong audience. Audience/occasion go in `query`.
  - commerce_l2s: category ids to restrict to (read the `commerce://categories` resource
    for valid values — that taxonomy is for shopping only).
  - max_price / min_price: price band (USD). platforms: ["amazon"|"walmart"] (empty=all).
  - intent: ranking preset — "cheapest" | "best_discount" | "top_rated" | "best_value".
  - require_commission: only return products that pay a commission (default: server
    setting, normally on). Pass false to include zero/unknown-commission products.
  - limit: max results (default 10).

`agent_id` is REQUIRED: your registered, active agent id. It is the attribution key and
the access key — a missing/blank or unregistered agent_id is rejected (no anonymous use).

Returns {count, products:[{offer_id,title,brand,price,rating,...,buy_url,product_url}]}.
Each product's `buy_url` is ALREADY the trackable affiliate buy link — hand it to the
shopper directly. (`product_url` is the plain product page.) There is no separate
resolve/click step.
- `search_travel`: Search travel offers and get trackable booking links for a given product type + city.

REQUIRED:
  - type: which travel product — one of
    ["hotel","flights","bundle","airport_transfer","car_rental"].
  - city: city name from the supported list — read the `travel://cities` resource for valid
    values (that city list is for travel only). Pass hotel.state (e.g. "NY") when the city
    name is ambiguous.
  - agent_id: your registered, active agent id — the attribution + access key. A
    missing/blank or unregistered agent_id is rejected (no anonymous use).

HOTEL runs a live Trip.com search — pass the `hotel` object with the stay: check_in /
check_out (YYYY-MM-DD), rooms, adults, children, state. If those are missing/invalid or the
city can't be resolved, you get the hotel default links instead. Other types currently
return curated default links (the `hotel` object is ignored for them).

Returns {status, reason, message, links:{<type>:[{title, brand, platform, buy_url,
product_url, ...}]}}. status is "ok" = a live hotel result; "fallback" = curated default
links (see `reason`); "no_results" = nothing available for the type; "error" = the agent_id
was rejected. Each `buy_url` is ALREADY the trackable booking link — hand it to the traveler
directly. `product_url` is the plain merchant page.
