# Agent Interface Discovery (`vincesoft/agent-interface-discovery`) Actor

Discover domain-owned ARD, A2A, OpenAPI, MCP, WebMCP, x402, and llms.txt evidence without registries, browsers, or guessed action endpoints.

- **URL**: https://apify.com/vincesoft/agent-interface-discovery.md
- **Developed by:** [VincSoft](https://apify.com/vincesoft) (community)
- **Categories:** Agents, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.05 / interface discovery

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Agent Interface Discovery do?

**Agent Interface Discovery checks which machine-readable interfaces a domain demonstrably exposes.** From one domain it inspects bounded domain-owned evidence for ARD, A2A, OpenAPI/Swagger, explicitly advertised MCP, declarative WebMCP, passive x402 signals, and `llms.txt`. It returns facts, typed locations, coverage, versions, evidence, warnings, and one of `found`, `advertised`, `unsupported`, `invalid`, `not_found`, `inaccessible`, or `not_observable` through the Apify API, schedules, integrations, or hosted MCP tooling.

The Actor does not query registries, guess action endpoints, initialize MCP, run a browser, initiate payment, or invent an “AI readiness” score.

### Why use Agent Interface Discovery?

Use it when an agent asks “What machine-readable interfaces does this domain expose?”, “Does this company advertise an A2A Agent Card?”, “Where is its OpenAPI description?”, or “Is MCP explicitly advertised?” The Actor turns up to twelve safe HTTP probes into deterministic routing facts and evidence, avoiding repeated discovery code and common false positives such as treating prose in `llms.txt` as a verified capability.

### How to use Agent Interface Discovery

1. Open the Input tab.
2. Enter one public hostname or HTTP(S) URL.
3. Run the Actor.
4. Inspect the sorted `interfaces` array or route directly on each `type` and `status`.

### Input

```json
{
    "domain": "example.com"
}
```

`domain` is the only input. Paths, queries, and fragments are discarded. Private, local, link-local, metadata, documentation, multicast, unspecified, and mixed public/private DNS targets are blocked.

### Output

```json
{
    "contractVersion": "1.0",
    "ok": true,
    "domain": "example.com",
    "interfaces": [
        {
            "type": "ard",
            "status": "not_found",
            "locations": [
                {
                    "url": "https://example.com/.well-known/ai-catalog.json",
                    "role": "canonical",
                    "outcome": "not_found",
                    "targetScope": "same_origin"
                }
            ],
            "evidence": [],
            "warnings": []
        },
        {
            "type": "webmcp_imperative",
            "status": "not_observable",
            "locations": [
                {
                    "url": "https://example.com/",
                    "role": "canonical",
                    "outcome": "not_observable",
                    "targetScope": "same_origin"
                }
            ],
            "evidence": [],
            "warnings": [{ "code": "BROWSER_REQUIRED" }]
        }
    ]
}
```

You can download the dataset in formats such as JSON, HTML, CSV, or Excel; JSON is recommended for nested evidence.

### Data table

| Field          | Meaning                                                          |
| -------------- | ---------------------------------------------------------------- |
| `domain`       | Normalized inspected domain.                                     |
| `interfaces`   | Eight deterministic interface results.                           |
| `coverage`     | Planned, attempted, completed, failed, and skipped probe counts. |
| `requestCount` | Requests consumed, including retries.                            |
| `decodedBytes` | Total decoded content inspected.                                 |
| `retrievedAt`  | Latest evidence timestamp.                                       |

### Pricing / Cost estimation

The provisional price is **$0.05 for one `interface-discovery` event**. Partial not-found, invalid, and per-interface inaccessible statuses remain a completed, billable domain determination. An origin-wide failure, input rejection, cancellation, resource-budget failure, or internal failure is free. Confirm live pricing before purchase.

### Tips and limits

The Actor schedules nine canonical targets plus up to three explicitly advertised same-origin or same-site manifests with concurrency four. Retries and redirects share a hard 24-attempt budget; decoded responses share a 5 MiB budget and 60-second deadline. External advertisements are reported but never fetched. Declarative WebMCP requires a form containing both non-empty `toolname` and `tooldescription`. Imperative WebMCP remains `not_observable` because page execution is out of scope.

### FAQ, disclaimers, and support

`found` means directly retrieved and validated or directly observed. `advertised` is an explicit domain-owned claim that was not independently verified. `not_found` is used only where applicable fixed locations were checked; MCP, imperative WebMCP, and unobserved x402 remain `not_observable`. `llms.txt` requires textual Markdown with an H1. `/mcp` is never guessed and x402 is passive only. Users remain responsible for lawful retrieval of public metadata. Use the Actor’s Issues tab for false positives, missed typed advertisements, or version updates with an anonymized reproducible domain fixture.

# Actor input Schema

## `domain` (type: `string`):

Public hostname or HTTP(S) URL whose domain-owned machine interfaces should be inspected.

## Actor input object example

```json
{
  "domain": "example.com"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing the single interface discovery envelope.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domain": "example.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vincesoft/agent-interface-discovery").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "domain": "example.com" }

# Run the Actor and wait for it to finish
run = client.actor("vincesoft/agent-interface-discovery").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domain": "example.com"
}' |
apify call vincesoft/agent-interface-discovery --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vincesoft/agent-interface-discovery"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EYpD8vYjE8IFNQhna/builds/WUBh84IlbgfqN7Zht/openapi.json
