Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 75 additions & 13 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,34 @@
# Release Please - Automated versioning and npm publishing
#
# How it works:
# 1. Every push to main with conventional commits updates a "Release PR"
# 2. When you merge the Release PR, it:
# - Updates version in package.json
# - Updates CHANGELOG.md
# - Creates a GitHub Release with tag
# - Triggers the npm publish job below
#
# Commit message format:
# feat: add new feature → minor version bump
# fix: fix a bug → patch version bump
# feat!: breaking change → major version bump
# chore/docs: no version bump
#
# npm Publishing:
# Uses Trusted Publishing (OIDC) - no NPM_TOKEN needed!
# Requires Node 24+ for npm 11.5.1+ OIDC support.
# Configure at: https://www.npmjs.com/package/@verygoodplugins/mcp-edd/access

name: Release Please

on:
push:
branches: [main]
branches:
- main

permissions:
contents: write
pull-requests: write
id-token: write

jobs:
release-please:
Expand All @@ -19,27 +40,68 @@ jobs:
- uses: googleapis/release-please-action@v4
id: release
with:
release-type: node
manifest-file: ".release-please-manifest.json"
config-file: "release-please-config.json"

publish:
npm-publish:
needs: release-please
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
environment: npm
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6

- uses: actions/setup-node@v6
with:
node-version: "20"
node-version: "24"
registry-url: "https://registry.npmjs.org"

- name: Install dependencies
run: npm ci
# Use npm install for cross-version lockfile compatibility
- run: npm install
- run: npm run build
- run: npm test

# Trusted Publishing: No NPM_TOKEN needed!
- run: npm publish --provenance --access public

- name: Build
run: npm run build
build-extension:
needs: release-please
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6

- name: Publish to npm
run: npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- uses: actions/setup-node@v6
with:
node-version: "20"
cache: "npm"

- run: npm ci
- run: npm run build:extension

- name: Upload Extension to Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.release-please.outputs.tag_name }}
files: "*.mcpb"

announce:
needs: [release-please, npm-publish]
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
steps:
- name: Post to Slack
if: ${{ vars.SLACK_WEBHOOK_URL }}
uses: slackapi/slack-github-action@v1
with:
webhook-url: ${{ vars.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
{
"text": "🚀 ${{ github.repository }} ${{ needs.release-please.outputs.tag_name }} released!\n\nhttps://github.com/${{ github.repository }}/releases/tag/${{ needs.release-please.outputs.tag_name }}"
}
3 changes: 3 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
".": "1.0.0"
}
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ Add to your `claude_desktop_config.json`:

## Available Tools

### Setup / Diagnostics

| Tool | Description |
|------|-------------|
| `edd_validate_connection` | Validate your Store API URL and credentials |

### Products

| Tool | Description |
Expand All @@ -96,6 +102,8 @@ Add to your `claude_desktop_config.json`:
| `edd_list_customers` | List customers with purchase stats |
| `edd_get_customer` | Get customer by ID or email |

Note: `edd_list_customers` returns the EDD **customer** ID as `id` (usable with `edd_get_customer(customerId=...)`) and includes `userId` when available.

### Statistics

| Tool | Description |
Expand Down
49 changes: 49 additions & 0 deletions assets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Brand Assets for Desktop Extension

This directory contains visual assets for the Claude Desktop Extension.

## Required Icons

Create VGP-branded icons with orange (#F97316) accent:

| File | Size | Purpose |
|------|------|---------|
| `icon.png` | 128x128 | Primary icon |
| `icon-16.png` | 16x16 | Small UI elements |
| `icon-32.png` | 32x32 | Medium UI elements |
| `icon-64.png` | 64x64 | Large UI elements |

**Design guidelines:**
- Use transparent background
- VGP orange (#F97316) as primary color
- Simple design that scales well to small sizes
- Consider EDD shopping cart or download icon theme

## Screenshots

Place in `screenshots/` directory:

| File | Description |
|------|-------------|
| `sales-query.png` | Claude conversation querying sales data |
| `customer-lookup.png` | Customer information retrieval example |

**Screenshot guidelines:**
- 1280x800 or similar aspect ratio
- Show Claude Desktop UI
- Demonstrate real tool usage
- Blur any sensitive data

## Generating Icons

Quick generation with ImageMagick (if VGP logo exists):

```bash
# From a source logo
convert logo.png -resize 128x128 icon.png
convert logo.png -resize 64x64 icon-64.png
convert logo.png -resize 32x32 icon-32.png
convert logo.png -resize 16x16 icon-16.png
```

Or create manually in Figma/Sketch using VGP brand guidelines.
Binary file added assets/screenshots/mcp-edd-setup.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 6 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
// ESLint flat config for VGP MCP servers
// Requires: eslint ^9.0.0, typescript-eslint ^8.0.0
// Requires: eslint ^9.0.0, typescript-eslint ^8.0.0, eslint-config-prettier ^10.0.0
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import prettier from 'eslint-config-prettier';

export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
prettier,
{
files: ['src/**/*.ts'],
rules: {
// MCP stdio servers must not write to stdout outside the protocol.
// Use console.error / console.warn for operational logs.
'no-console': ['error', { allow: ['error', 'warn'] }],
// Allow unused vars prefixed with underscore
'@typescript-eslint/no-unused-vars': [
'error',
Expand Down
98 changes: 81 additions & 17 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,20 @@
"name": "io.github.verygoodplugins/mcp-edd",
"display_name": "Easy Digital Downloads",
"version": "1.0.0",
"description": "MCP server for Easy Digital Downloads - sales, customers, products, analytics",
"description": "Query your EDD store's sales, customers, products, and analytics from Claude",

"long_description": "Query your EDD store's sales, customers, and products directly from Claude. Get instant insights into revenue, customer behavior, and product performance.\n\n**What you can do:**\n\n• Sales Analytics - \"Show me this month's revenue\" or \"Compare Q4 sales to last year\"\n• Customer Insights - \"Find customers who purchased WP Fusion\" or \"Show top 10 by lifetime value\"\n• Product Data - \"List all products with their sales stats\" or \"Show pricing for premium tier\"\n• Discount Tracking - \"Which discount codes were used this week?\"\n\nBuilt by Very Good Plugins, the team behind WP Fusion - trusted by 10,000+ WordPress sites for CRM and marketing integrations.",

"author": {
"name": "Very Good Plugins",
"url": "https://verygoodplugins.com"
"email": "support@verygoodplugins.com",
"url": "https://verygoodplugins.com/?utm_source=mcpb"
},

"icon": "assets/icon.png",

"screenshots": ["assets/screenshots/mcp-edd-setup.jpg"],
Comment thread
jack-arturo marked this conversation as resolved.

"server": {
"type": "node",
"entry_point": "dist/index.js",
Expand All @@ -21,11 +30,12 @@
}
}
},

"user_config": {
"edd_api_url": {
"type": "string",
"title": "Store API URL",
"description": "Your EDD store API endpoint (e.g., https://example.com/edd-api/)",
"description": "Your EDD store API endpoint (must end with /edd-api/, e.g., https://example.com/edd-api/)",
"required": true
},
"edd_api_key": {
Expand All @@ -43,28 +53,82 @@
"required": true
}
},

"tools": [
{ "name": "edd_list_products", "description": "List all products from the EDD store" },
{ "name": "edd_get_product", "description": "Get detailed product info by ID" },
{ "name": "edd_list_sales", "description": "List recent sales with optional filters" },
{ "name": "edd_get_sale", "description": "Get sale by ID or purchase key" },
{ "name": "edd_list_customers", "description": "List customers with purchase stats" },
{ "name": "edd_get_customer", "description": "Get customer by ID or email" },
{ "name": "edd_get_stats", "description": "Get earnings or sales statistics" },
{ "name": "edd_get_stats_by_date", "description": "Get daily stats for a date range" },
{ "name": "edd_get_stats_by_product", "description": "Get stats breakdown by product" },
{ "name": "edd_list_discounts", "description": "List all discount codes" },
{ "name": "edd_get_discount", "description": "Get discount details by ID" },
{ "name": "edd_get_download_logs", "description": "Get file download history" }
{
"name": "edd_validate_connection",
"description": "Validate your Store API URL and credentials"
},
{
"name": "edd_list_products",
"description": "List all products from the EDD store with pricing and sales stats"
},
{
"name": "edd_get_product",
"description": "Get detailed product info including pricing tiers and license info"
},
{
"name": "edd_list_sales",
"description": "List recent sales with date, customer, and product filters"
},
{ "name": "edd_get_sale", "description": "Get complete sale details by ID or purchase key" },
{
"name": "edd_list_customers",
"description": "List customers with purchase history and lifetime value"
},
{ "name": "edd_get_customer", "description": "Get customer details by ID or email address" },
{
"name": "edd_get_stats",
"description": "Get earnings and sales totals with optional date filtering"
},
{
"name": "edd_get_stats_by_date",
"description": "Get daily revenue and sales breakdown for a date range"
},
{
"name": "edd_get_stats_by_product",
"description": "Get sales and revenue breakdown by product"
},
{ "name": "edd_list_discounts", "description": "List all discount codes with usage stats" },
{
"name": "edd_get_discount",
"description": "Get discount details including usage limits and expiration"
},
{
"name": "edd_get_download_logs",
"description": "Get file download history for products or customers"
}
],

"repository": {
"type": "git",
"url": "https://github.com/verygoodplugins/mcp-edd"
},
"homepage": "https://github.com/verygoodplugins/mcp-edd",

"homepage": "https://verygoodplugins.com/mcp/?utm_source=mcpb",
"documentation": "https://github.com/verygoodplugins/mcp-edd#readme",
"support": "https://github.com/verygoodplugins/mcp-edd/issues",

"privacy_policies": ["https://verygoodplugins.com/privacy-policy/?utm_source=mcpb"],

"license": "GPL-3.0",
"keywords": ["edd", "easy-digital-downloads", "ecommerce", "sales", "wordpress"],

"keywords": [
"mcp",
"claude",
"ai-tools",
"wordpress",
"easy-digital-downloads",
"edd",
"ecommerce",
"sales-analytics",
"customer-data",
"verygoodplugins",
"automation"
],

"compatibility": {
"claude_desktop": ">=1.0.0",
"platforms": ["darwin", "win32", "linux"],
"runtimes": {
"node": ">=18.0.0"
Expand Down
Binary file modified mcp-edd.mcpb
Binary file not shown.
Loading
Loading