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.
https://api.ful.io/mcpIntroduction
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.
| Tool | Purpose | Access |
|---|---|---|
| list_categories | All technology categories with counts | Free · no key |
| get_category_details | Technologies within a category | Free · no key |
| get_technology_details | Profile of a technology + alternatives | Free · no key |
| lookup_website_technologies | Full tech stack of a website | API key · 1 credit |
| get_account_usage | Your plan and remaining credits | API 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_KEYIf 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.
| Property | Value |
|---|---|
| Endpoint | https://api.ful.io/mcp |
| Method | POST |
| Protocol | JSON-RPC 2.0 (Model Context Protocol) |
| Protocol version | 2025-06-18 |
| Server | Ful.io 1.0.0 |
| Methods | initialize, 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.
| Tool | Cost | Limit |
|---|---|---|
| list_categories | Free | 300 / hour / IP |
| get_category_details | Free | 300 / hour / IP |
| get_technology_details | Free | 300 / hour / IP |
| lookup_website_technologies | 1 API credit | Limited by your credits |
| get_account_usage | Free | Requires 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 keylist_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
| Field | Type | Description |
|---|---|---|
| total_categories | integer | Number of categories returned. |
| categories | array | List of category objects. |
| categories[].category_name | string | Human-readable category name. |
| categories[].category_slug | string | URL-friendly category identifier (use with get_category_details). |
| categories[].technology_count | integer | Number 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 keyget_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
| Parameter | Type | Required | Description |
|---|---|---|---|
| category_slug | string | Yes | Category 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
| Field | Type | Description |
|---|---|---|
| category | object | The category, with name, slug and description. |
| total_technology_count | integer | Total technologies in this category. |
| technology_list | array | Technologies in the category. |
| technology_list[].name | string | Technology name. |
| technology_list[].slug | string | Technology slug (use with get_technology_details). |
| technology_list[].icon | string | Icon filename. |
| technology_list[].total_domain_count | integer | Number 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 keyget_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
| Parameter | Type | Required | Description |
|---|---|---|---|
| technology_slug | string | Yes | Technology 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
| Field | Type | Description |
|---|---|---|
| technology_name | string | Technology name. |
| technology_slug | string | Technology slug. |
| technology_description | string | Description of the technology. |
| tech_icon | string | Icon filename. |
| tech_website | string | Official website of the technology. |
| domain_count | integer | Total number of websites detected using it. |
| categories | array | Categories the technology belongs to ({ name, slug }). |
| alternatives | array | Alternative technologies ({ tech_name, tech_slug, tech_icon }). |
| websites_name | object | Sample websites using the technology, mapped to a detection score. |
| websites_faq | array | Frequently 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 creditlookup_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
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | The 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
| Field | Type | Description |
|---|---|---|
| domain_name | string | The normalized domain analyzed. |
| title | string | The website's page title. |
| description | string | The website's meta description. |
| social_links | array | Social profiles found ({ platform, url }). A platform may appear more than once. |
| date_established | string | Approximate date the domain was first established (YYYY-MM-DD). |
| technologies | array | Detected technologies grouped by category. |
| technologies[].category_name | string | Category name, e.g. 'Payment Processors'. |
| technologies[].category_slug | string | Category slug. |
| technologies[].technologies[] | array | Technologies 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 creditget_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
| Field | Type | Description |
|---|---|---|
| plan | string | Current plan name. |
| is_active | boolean | Whether the membership is active. |
| period_start | string | ISO 8601 start of the current billing period. |
| period_end | string | ISO 8601 end of the current billing period. |
| remaining_credits | object | Remaining credits per pool: total, technology_lookup, api, technology_reports. |
| limits | object | Plan 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
}
}| Message | Cause |
|---|---|
| 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)
| Code | Meaning |
|---|---|
| -32700 | Parse error (body was not valid JSON). |
| -32600 | Invalid request (not a valid JSON-RPC message). |
| -32601 | Method not found. |
| -32602 | Invalid 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.