Developer Documentation

MCP Server

Connect Ful.io's web technology intelligence to AI agents through the Model Context Protocol. Look up the tech stack of any website and browse technologies and categories directly from Claude, Cursor, or any MCP client.

Streamable HTTP
JSON-RPC 2.0
5 tools
Server URL
https://api.ful.io/mcp

Introduction

The Ful.io MCP server exposes our web technology intelligence as a set of tools that any Model Context Protocol client can call, such as Claude Desktop, Cursor, or your own agent. It lets an AI assistant answer questions like "what is this website built with?", "which technologies are in the Ecommerce category?", or "what are the alternatives to Shopify?" without you writing any API code.

There are five tools. Three are free and need no API key (browsing categories and technologies); two require an API key (looking up a specific website's stack, and checking your usage). Everything is served from a single endpoint: https://api.ful.io/mcp.

ToolPurposeAccess
list_categoriesAll technology categories with countsFree · no key
get_category_detailsTechnologies within a categoryFree · no key
get_technology_detailsProfile of a technology + alternativesFree · no key
lookup_website_technologiesFull tech stack of a websiteAPI key · 1 credit
get_account_usageYour plan and remaining creditsAPI key · no credit

Quickstart (Claude Desktop)

New to MCP? An MCP server gives Claude new abilities it can use while chatting with you. Once connected, you can simply ask Claude things like "what is stripe.com built with?" and it will fetch the answer from Ful.io for you. Here is the fastest way to set it up.

What you need

The Claude Desktop app (the downloadable one), Node.js installed from nodejs.org, and your API key from your account security page.

Step 1 — Open the config file

In Claude Desktop, go to Settings → Developer → Edit Config. This opens a file named claude_desktop_config.json.

Step 2 — Add the Ful.io server

Paste this in, replacing PASTE_YOUR_KEY_HERE with your API key:

{
  "mcpServers": {
    "ful-io": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.ful.io/mcp",
        "--header",
        "x-api-key:${FUL_API_KEY}"
      ],
      "env": {
        "FUL_API_KEY": "PASTE_YOUR_KEY_HERE"
      }
    }
  }
}

Step 3 — Restart Claude

Fully quit and reopen Claude Desktop. You will see a tools icon in the chat box; click it to confirm the five ful-io tools are listed.

Step 4 — Use it

Just ask normally. Claude decides when to use the tools and will ask your permission the first time. Try prompts like:

"Using Ful.io, what technologies is shopify.com running?"

"What are the top alternatives to WordPress?"

"List the ecommerce technologies Ful.io tracks and which is most popular."

"How many Ful.io API credits do I have left?"

The browse tools are free; a website lookup uses 1 API credit. Prefer to try it without editing any config first? Use the MCP Inspector shown below.

Connect a client

The server speaks Streamable HTTP. Most desktop clients connect through the mcp-remote bridge, which is started for you via npx (no install needed). Put your API key in the FUL_API_KEY environment variable; the free tools work even without it.

Claude Desktop  ·  Cursor  ·  MCP Inspector

{
  "mcpServers": {
    "ful-io": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.ful.io/mcp",
        "--header",
        "x-api-key:${FUL_API_KEY}"
      ],
      "env": {
        "FUL_API_KEY": "your_api_key_here"
      }
    }
  }
}

For Claude Desktop, add the block above to claude_desktop_config.json (Settings → Developer → Edit Config) and restart the app. For Cursor, use ~/.cursor/mcp.json. After connecting, the five Ful.io tools appear in the client's tool list.

Get your API key from your account security page, or visit pricing to choose a plan with API access.

Authentication

The three browse tools are open and require no key. The two account tools require a Ful.io API key, sent as the x-api-key request header. An Authorization: Bearer header is also accepted. Your MCP client sends this header on every request once configured.

x-api-key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY

If a key is required but missing, the tool returns an error result asking for it. If the key is invalid or inactive, it returns Invalid or inactive API key. Your key is stable across renewals and plan changes, so you can configure it once.

Transport & protocol

The server implements the Model Context Protocol over Streamable HTTP using JSON-RPC 2.0. All traffic is a single POST to https://api.ful.io/mcp with a JSON body; responses are returned as application/json.

PropertyValue
Endpointhttps://api.ful.io/mcp
MethodPOST
ProtocolJSON-RPC 2.0 (Model Context Protocol)
Protocol version2025-06-18
ServerFul.io 1.0.0
Methodsinitialize, tools/list, tools/call, ping, notifications/*

If you use a standard MCP client you never touch this layer, the client handles the handshake. See Raw JSON-RPC if you are building your own client.

Credits & rate limits

The browse tools are free and protected by a generous per-IP limit of 300 requests per hour. The website lookup tool consumes 1 API credit per successful call from your plan's API allowance, the same pool used by the REST API. Checking your usage is free.

ToolCostLimit
list_categoriesFree300 / hour / IP
get_category_detailsFree300 / hour / IP
get_technology_detailsFree300 / hour / IP
lookup_website_technologies1 API creditLimited by your credits
get_account_usageFreeRequires API key

Every metered lookup is recorded in your credit log as Technology lookup (MCP) for example.com, so you can tell MCP usage apart from direct API usage.


list_categories

Free · no key
list_categories()

Returns every technology category Ful.io tracks, along with the number of technologies in each. Useful as a starting point to discover categories before drilling into one. Takes no arguments.

Parameters

None.

Example call

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "list_categories",
      "arguments": {}
    }
  }'

Result fields

FieldTypeDescription
total_categoriesintegerNumber of categories returned.
categoriesarrayList of category objects.
categories[].category_namestringHuman-readable category name.
categories[].category_slugstringURL-friendly category identifier (use with get_category_details).
categories[].technology_countintegerNumber of technologies in the category.

Example result

{
  "total_categories": 263,
  "categories": [
    { "category_name": "Widgets", "category_slug": "Widgets", "technology_count": 2978 },
    { "category_name": "Analytics", "category_slug": "Analytics", "technology_count": 1491 }
  ]
}

get_category_details

Free · no key
get_category_details(category_slug)

Returns all technologies within a specific category, ordered by how many websites use them. Use a category_slug from list_categories.

Parameters

ParameterTypeRequiredDescription
category_slugstringYesCategory slug, e.g. 'Ecommerce' or 'Analytics'.

Example call

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "get_category_details",
      "arguments": { "category_slug": "Ecommerce" }
    }
  }'

Result fields

FieldTypeDescription
categoryobjectThe category, with name, slug and description.
total_technology_countintegerTotal technologies in this category.
technology_listarrayTechnologies in the category.
technology_list[].namestringTechnology name.
technology_list[].slugstringTechnology slug (use with get_technology_details).
technology_list[].iconstringIcon filename.
technology_list[].total_domain_countintegerNumber of websites using the technology.

Example result

{
  "category": { "name": "Ecommerce", "slug": "Ecommerce", "description": null },
  "total_technology_count": 1190,
  "technology_list": [
    { "icon": "WooCommerce.svg", "name": "WooCommerce", "slug": "WooCommerce", "total_domain_count": 5799489 },
    { "icon": "Wix Stores.png", "name": "Wix Stores", "slug": "wix-stores", "total_domain_count": 2515283 }
  ]
}

get_technology_details

Free · no key
get_technology_details(technology_slug)

Returns a detailed profile of a single technology: description, categories, total websites using it, a sample of those websites, and alternative technologies. Use a technology_slug from get_category_details or your own knowledge.

Parameters

ParameterTypeRequiredDescription
technology_slugstringYesTechnology slug, e.g. 'Shopify' or 'React'.

Example call

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "get_technology_details",
      "arguments": { "technology_slug": "Shopify" }
    }
  }'

Result fields

FieldTypeDescription
technology_namestringTechnology name.
technology_slugstringTechnology slug.
technology_descriptionstringDescription of the technology.
tech_iconstringIcon filename.
tech_websitestringOfficial website of the technology.
domain_countintegerTotal number of websites detected using it.
categoriesarrayCategories the technology belongs to ({ name, slug }).
alternativesarrayAlternative technologies ({ tech_name, tech_slug, tech_icon }).
websites_nameobjectSample websites using the technology, mapped to a detection score.
websites_faqarrayFrequently asked questions about the technology.

Example result

{
  "technology_name": "Shopify",
  "technology_slug": "Shopify",
  "tech_icon": "Shopify.svg",
  "tech_website": "http://shopify.com",
  "technology_description": "Shopify is a commerce platform ...",
  "domain_count": 976010,
  "categories": [ { "name": "Ecommerce", "slug": "Ecommerce" } ],
  "alternatives": [
    { "tech_name": "WooCommerce", "tech_icon": "WooCommerce.svg", "tech_slug": "WooCommerce" },
    { "tech_name": "Wix Stores", "tech_icon": "Wix Stores.png", "tech_slug": "wix-stores" }
  ],
  "websites_name": {
    "burlapbasement.com": 95,
    "brotique.bio": 90
  },
  "websites_faq": [ "..." ]
}

lookup_website_technologies

API key · 1 credit
lookup_website_technologies(domain)

Returns the full technology stack detected on a specific website, grouped by category, along with the site's title, description, social profiles, and approximate establishment date. Requires an API key and consumes 1 API credit per successful call.

Parameters

ParameterTypeRequiredDescription
domainstringYesThe website domain to analyze, e.g. 'example.com'. https:// and paths are stripped automatically.

Example call

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "lookup_website_technologies",
      "arguments": { "domain": "ful.io" }
    }
  }'

Result fields

FieldTypeDescription
domain_namestringThe normalized domain analyzed.
titlestringThe website's page title.
descriptionstringThe website's meta description.
social_linksarraySocial profiles found ({ platform, url }). A platform may appear more than once.
date_establishedstringApproximate date the domain was first established (YYYY-MM-DD).
technologiesarrayDetected technologies grouped by category.
technologies[].category_namestringCategory name, e.g. 'Payment Processors'.
technologies[].category_slugstringCategory slug.
technologies[].technologies[]arrayTechnologies in the category, each with name, description, icon, website, technology_slug.

Example result

{
  "domain_name": "ful.io",
  "title": "Find out what websites are built with - Ful.io",
  "description": "Website technology checker and web technology lookup ...",
  "social_links": [
    { "platform": "linkedin", "url": "linkedin.com/company/ful-io" },
    { "platform": "twitter", "url": "twitter.com/TechProfilerFul" }
  ],
  "date_established": "2025-12-16",
  "technologies": [
    {
      "category_slug": "JavaScript-Frameworks",
      "category_name": "JavaScript Frameworks",
      "technologies": [
        {
          "name": "React",
          "description": "React is a front-end JavaScript library ...",
          "icon": "React.png",
          "website": "https://reactjs.org",
          "technology_slug": "React"
        }
      ]
    }
  ]
}

get_account_usage

API key · no credit
get_account_usage()

Returns the API key owner's current plan, billing period, and remaining credits across every pool. Useful for an agent to check its remaining budget before running lookups. Requires an API key but does not consume credits.

Parameters

None (the account is identified by the API key header).

Example call

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "get_account_usage",
      "arguments": {}
    }
  }'

Result fields

FieldTypeDescription
planstringCurrent plan name.
is_activebooleanWhether the membership is active.
period_startstringISO 8601 start of the current billing period.
period_endstringISO 8601 end of the current billing period.
remaining_creditsobjectRemaining credits per pool: total, technology_lookup, api, technology_reports.
limitsobjectPlan limits per pool: total, technology_lookup, api, technology_reports.

Example result

{
  "plan": "Professional",
  "is_active": true,
  "period_start": "2026-06-01T00:00:00+00:00",
  "period_end": "2026-07-01T00:00:00+00:00",
  "remaining_credits": {
    "total": 8500,
    "technology_lookup": 4200,
    "api": 9300,
    "technology_reports": 900
  },
  "limits": {
    "total": 10000,
    "technology_lookup": 5000,
    "api": 10000,
    "technology_reports": 1000
  }
}

Errors

There are two kinds of errors. Tool errors (bad input, missing key, insufficient credits, rate limit) are returned as a normal tools/call result with isError: true and a human-readable message, so the agent can read and react to them. Protocol errors (malformed request, unknown method) are returned as JSON-RPC errors.

Tool errors (isError: true)

{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [{ "type": "text", "text": "Invalid or inactive API key." }],
    "isError": true
  }
}
MessageCause
An API key is required for this tool ...A metered tool was called without a key.
Invalid or inactive API key.The key does not match an active membership.
Insufficient API credits. Upgrade your plan to continue.No API credits remaining.
A valid 'domain' is required, e.g. 'example.com'.Missing or unparseable domain.
Category '...' was not found.Unknown category slug.
Technology '...' was not found.Unknown technology slug.
Rate limit exceeded. Please slow down ...More than 300 free-tool requests in an hour from your IP.

Protocol errors (JSON-RPC)

CodeMeaning
-32700Parse error (body was not valid JSON).
-32600Invalid request (not a valid JSON-RPC message).
-32601Method not found.
-32602Invalid params or unknown tool name.

Raw JSON-RPC

If you are building your own client (rather than using Claude, Cursor, or the Inspector), here is the bare protocol. Start with initialize, then list and call tools.

1. Initialize

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-06-18",
      "capabilities": {},
      "clientInfo": { "name": "my-client", "version": "1.0.0" }
    }
  }'

Response:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": { "tools": {} },
    "serverInfo": { "name": "Ful.io", "version": "1.0.0" }
  }
}

2. List tools

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" }'

3. Call a tool

curl -X POST https://api.ful.io/mcp \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "lookup_website_technologies",
      "arguments": { "domain": "ful.io" }
    }
  }'

Tool results return content as a JSON string inside result.content[0].text; parse that string to get the structured data shown in each tool's example result above.