EcomGraph MCP Server

Connect any MCP-compatible AI agent to the EcomGraph Shopify app catalog. No API key required — the catalog is already public.

Auth & identity

The server is open — no authentication needed. However, you must identify your agent by setting clientInfo.name in your MCP initialize message (e.g. "claude-desktop", "cursor", "my-agent"). Connections without an identity are rejected with a clear error. A per-agent rate limit of 60 requests/minute applies.

Transports

Two transports are available. Use Streamable HTTP for new integrations — it is the current MCP spec (2025-03-26) and required by gateway registries such as Smithery and Glama. The legacy SSE transport remains available for clients that are already pinned to it.

RecommendedStreamable HTTP (2025-03-26 spec)
https://api.ecomgraph.com/mcp

Single endpoint — send JSON-RPC via POST /mcp. Session correlation via Mcp-Session-Id header.

LegacyHTTP + SSE
https://api.ecomgraph.com/mcp/sse

Server stream on GET /mcp/sse, client messages on POST /mcp/messages?sessionId=…. Kept for backwards compatibility.

How to connect

Claude Desktop

Add the following to your claude_desktop_config.json:

{
  "mcpServers": {
    "ecomgraph": {
      "url": "https://api.ecomgraph.com/mcp"
    }
  }
}

Cursor

In Cursor settings → MCP → Add server, enter:

https://api.ecomgraph.com/mcp

Custom agent — Streamable HTTP (TypeScript)

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(
  new URL("https://api.ecomgraph.com/mcp")
);
const client = new Client(
  { name: "my-agent", version: "1.0.0" },
  { capabilities: {} }
);
await client.connect(transport);

const result = await client.callTool("search_apps", { query: "email marketing" });

Custom agent — legacy SSE (TypeScript)

Use only if your SDK does not yet support Streamable HTTP.

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";

const transport = new SSEClientTransport(
  new URL("https://api.ecomgraph.com/mcp/sse")
);
const client = new Client(
  { name: "my-agent", version: "1.0.0" },
  { capabilities: {} }
);
await client.connect(transport);

const result = await client.callTool("search_apps", { query: "email marketing" });

Available tools (v1)

All tools are read-only. Every response includes a source_url pointing back to the canonical EcomGraph page.

search_apps(query, category?, limit?)

Full-text search across the entire app catalog. Optionally filter by category slug and cap results.

get_app(slug)

Retrieve the full app record: name, developer, pricing tiers, rating, review count, Built for Shopify badge, launch date, and FAQ if available.

list_categories()

Return the full 3-level taxonomy (parent → child → leaf) with app counts at each level.

list_best_in_category(category_slug, limit?)

Top-ranked apps in a category, sorted by rating and review count. Mirrors the /best/{category} pages on the site.

compare_apps(slugs[])

Side-by-side comparison of 2–5 apps: pricing, ratings, features, and developer info.

list_developer_apps(developer_slug)

All apps published by a developer along with aggregate stats (total reviews, average rating, Built for Shopify count).

LLM-friendly text files

For agents and crawlers that prefer plain text over structured APIs, EcomGraph publishes two files at well-known paths:

/llms.txt

A prose briefing (~3 KB): what EcomGraph is, how to construct URLs, and how to connect via MCP. The recommended starting point for any LLM being pointed at this domain.

/llms-full.txt

A bulk dump of every app, category, developer, and blog page in stable order with per-page front-matter. Use this for exhaustive ingestion when MCP is unavailable. Refreshed hourly.