Skip to content
Community Documentation: This documentation is provided as-is and may contain errors or become outdated. Always verify information against the actual implementation and test thoroughly before production use.

Feed Structure

This guide covers the complete structure of feed formats for MCP discovery.

Feed Formats Overview

LLMFeed tools support two complementary formats:

FormatFile ExtensionStatusUse Case
LLMFeed JSON.jsonFully SupportedStructured data with signing
llm.txt.txt🚧 Work in ProgressHuman-readable markdown

Recommendation

Use LLMFeed JSON format for full tooling support including validation, cryptographic signing, and health monitoring. You can additionally provide an llm.txt file for human readers.


LLMFeed JSON Format (Fully Supported ✅)

An LLMFeed JSON document is a structured format that describes a service's capabilities for AI agent consumption. It supports:

  • Schema validation - Strict validation with detailed error messages
  • Cryptographic signing - Ed25519 signatures for authenticity
  • Capability schemas - JSON Schema for parameters and responses
  • Health monitoring - Automated crawling and reporting

Minimal Valid Feed

The simplest valid LLMFeed JSON requires feed_type, metadata, and items:

json
{
  "feed_type": "llmfeed",
  "metadata": {
    "title": "My Service",
    "origin": "https://example.com",
    "description": "A brief description of what this service does"
  },
  "items": [
    {
      "title": "About",
      "url": "https://example.com/about"
    }
  ]
}

Complete Schema

Root Fields

FieldTypeRequiredDescription
feed_typestringMust be "llmfeed"
metadataobjectFeed metadata (title, origin, description)
capabilitiesarrayMachine-callable capabilities
itemsarrayContent items and resources
trustobjectCryptographic trust information

Metadata Object (Required)

json
{
  "metadata": {
    "title": "My Awesome Service",
    "origin": "https://api.example.com",
    "description": "A service that helps AI agents do amazing things",
    "logo": "https://example.com/logo.png",
    "contact": {
      "email": "support@example.com",
      "name": "Support Team",
      "url": "https://example.com/contact"
    }
  }
}
FieldTypeRequiredDescription
titlestringHuman-readable name of the service
originstringPrimary URL/origin for the service
descriptionstringLonger description for context
logostringURL to service logo
contactobjectContact information

Capabilities Array

Capabilities are the machine-callable functions your service offers:

json
{
  "capabilities": [
    {
      "name": "search",
      "description": "Search our knowledge base",
      "endpoint": "/api/search",
      "method": "POST",
      "authentication": {
        "type": "bearer",
        "header": "Authorization"
      },
      "parameters": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search query"
          },
          "filters": {
            "type": "object",
            "properties": {
              "category": { "type": "string" },
              "dateRange": { "type": "string" }
            }
          }
        },
        "required": ["query"]
      },
      "response": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": { "type": "string" },
                "url": { "type": "string" },
                "snippet": { "type": "string" }
              }
            }
          }
        }
      },
      "rateLimit": {
        "requests": 100,
        "window": "1h"
      }
    }
  ]
}
FieldTypeRequiredDescription
namestringUnique identifier for the capability
descriptionstringWhat this capability does
endpointstringAPI endpoint path
methodstringHTTP method (GET, POST, etc.)
authenticationobjectAuth requirements
parametersobjectJSON Schema for input parameters
responseobjectJSON Schema for response format
rateLimitobjectRate limiting information

Items Array

Items are content resources associated with your service:

json
{
  "items": [
    {
      "title": "API Documentation",
      "description": "Complete API reference",
      "url": "https://docs.example.com/api",
      "type": "documentation",
      "tags": ["api", "reference"],
      "published": "2025-11-15T10:00:00Z",
      "updated": "2025-12-01T14:30:00Z"
    },
    {
      "title": "Getting Started Guide",
      "description": "Quick start tutorial",
      "url": "https://docs.example.com/quickstart",
      "type": "tutorial",
      "tags": ["beginner", "quickstart"]
    }
  ]
}
FieldTypeRequiredDescription
titlestringItem title
descriptionstringItem description
urlstringURL to the resource
typestringContent type (documentation, tutorial, etc.)
tagsarrayCategorization tags
publishedstringISO 8601 publish date
updatedstringISO 8601 last update date
contentstringInline content (for small resources)

Trust Block

The trust block contains cryptographic signing information:

json
{
  "trust": {
    "type": "signed",
    "algorithm": "ed25519",
    "publicKey": "MCowBQYDK2VwAyEA...",
    "signature": "base64-signature...",
    "signedBlocks": ["feed_type", "metadata", "capabilities", "items"],
    "timestamp": "2025-12-01T14:30:00Z"
  }
}

See Trust & Signatures for detailed documentation.

Full Example (LLMFeed JSON)

Here's a complete, production-ready feed:

json
{
  "feed_type": "llmfeed",
  "metadata": {
    "title": "Acme Analytics API",
    "origin": "https://analytics.acme.com",
    "description": "Real-time analytics and reporting for your applications",
    "logo": "https://acme.com/logo.png",
    "contact": {
      "email": "api-support@acme.com",
      "name": "API Support Team",
      "url": "https://acme.com/support"
    }
  },
  
  "capabilities": [
    {
      "name": "query",
      "description": "Execute analytics queries against your data",
      "endpoint": "/api/v1/query",
      "method": "POST",
      "authentication": {
        "type": "bearer"
      },
      "parameters": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "SQL-like query string"
          },
          "timeRange": {
            "type": "object",
            "properties": {
              "start": { "type": "string", "format": "date-time" },
              "end": { "type": "string", "format": "date-time" }
            }
          }
        },
        "required": ["query"]
      },
      "rateLimit": {
        "requests": 1000,
        "window": "1h"
      }
    },
    {
      "name": "createReport",
      "description": "Generate a formatted analytics report",
      "endpoint": "/api/v1/reports",
      "method": "POST",
      "parameters": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "query": { "type": "string" },
          "format": { 
            "type": "string",
            "enum": ["pdf", "csv", "json"]
          }
        },
        "required": ["name", "query"]
      }
    }
  ],
  
  "items": [
    {
      "title": "API Reference",
      "description": "Complete API documentation",
      "url": "https://docs.acme.com/analytics/api",
      "type": "documentation"
    },
    {
      "title": "Query Language Guide",
      "description": "Learn our SQL-like query language",
      "url": "https://docs.acme.com/analytics/query-language",
      "type": "documentation"
    },
    {
      "title": "Getting Started",
      "description": "Quick start tutorial",
      "url": "https://docs.acme.com/analytics/quickstart",
      "type": "tutorial"
    }
  ],
  
  "trust": {
    "type": "signed",
    "algorithm": "ed25519",
    "publicKey": "MCowBQYDK2VwAyEA7890xyz...",
    "signature": "base64-signature...",
    "signedBlocks": ["feed_type", "metadata", "capabilities", "items"],
    "timestamp": "2025-12-01T14:30:00Z"
  }
}

llm.txt Format (Work in Progress 🚧)

Tooling Status

llm.txt is a markdown-based format for human-readable service documentation. Our tools do not yet parse or validate this format. Support is planned for future releases. You can serve llm.txt files for discovery, but use LLMFeed JSON for full tooling support.

What is llm.txt?

llm.txt is a proposed standard for providing human-readable (and LLM-readable) documentation about a website or service. It uses markdown format and is typically placed at:

  • /.well-known/llm.txt
  • /llm.txt

Example llm.txt

markdown
# Acme Analytics

> Real-time analytics and reporting for your applications

Acme Analytics provides powerful analytics APIs for tracking user behavior, generating reports, and visualizing data trends.

## Capabilities

- **Query API**: Execute SQL-like queries against your analytics data
- **Reports**: Generate PDF, CSV, or JSON formatted reports
- **Real-time**: Stream live analytics data via WebSocket

## Authentication

All API requests require a Bearer token. Get your API key from the dashboard.

## Documentation

- [API Reference](https://docs.acme.com/analytics/api)
- [Query Language Guide](https://docs.acme.com/analytics/query-language)
- [Getting Started](https://docs.acme.com/analytics/quickstart)

## Contact

- Email: api-support@acme.com
- Support: https://acme.com/support

llm.txt vs LLMFeed JSON

Featurellm.txtLLMFeed JSON
FormatMarkdownJSON
Human Readable✅ Excellent⚠️ Good
Machine Parseable⚠️ Requires parsing✅ Native
Schema Validation🚧 Coming soon✅ Full support
Cryptographic Signing❌ Not supported✅ Ed25519
Capability Schemas❌ Not supported✅ JSON Schema
Health Monitoring🚧 Coming soon✅ Full support
Best ForDocumentationAPI integration

For maximum compatibility, we recommend providing both formats:

  1. LLMFeed JSON (/llmfeed.json or /.well-known/llmfeed.json) for machine consumption with full tooling support
  2. llm.txt (/llm.txt or /.well-known/llm.txt) for human readers and LLMs that prefer markdown

Validation

Validate your LLMFeed JSON before publishing:

bash
npx llmfeed-validate feed.json

The validator checks:

  • Required fields are present (feed_type, metadata.title, metadata.origin, metadata.description)
  • Field types match the schema
  • URLs are valid format
  • JSON Schema in capabilities is valid
  • Signature matches (if present)

llm.txt Validation

Validation for llm.txt format is not yet available. It's on our roadmap for future releases.

Best Practices

1. Be Descriptive

Write clear, detailed descriptions that help AI agents understand your service:

json
// ❌ Bad
{ "metadata": { "description": "Search API" } }

// ✅ Good
{ "metadata": { "description": "Full-text search across our product catalog with filtering by category, price range, and availability. Returns paginated results with relevance scoring." } }

2. Document Parameters Thoroughly

Include descriptions and examples for all parameters:

json
{
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Search query using our query language. Supports AND, OR, NOT operators and field-specific searches like 'category:electronics'",
        "examples": ["laptop", "category:electronics AND price:<1000"]
      }
    }
  }
}

3. Keep Items Updated

Regularly update the items array with your latest documentation:

json
{
  "items": [
    {
      "title": "v2.0 Migration Guide",
      "url": "https://docs.example.com/migration",
      "published": "2025-11-15",
      "updated": "2025-12-01"
    }
  ]
}

4. Sign Your Feeds

Always sign production LLMFeed JSON feeds for trust and verification. See Trust & Signatures.

5. Provide Both Formats

For the best experience, serve both LLMFeed JSON (for tooling) and llm.txt (for humans):

https://example.com/llmfeed.json      # For tooling (validator, signer, etc.)
https://example.com/llm.txt           # For humans and LLMs (coming soon)

Community documentation provided as-is. Not official guidance. Verify before production use.